Como posso adicionar uma animação ao término da atividade ()


98

Estou usando overridePendingTransition para quando minha atividade é criada e funciona bem. Posso ver que o fade in funciona muito bem, mas quando tento animar o acabamento da atividade, ainda estou fazendo o slide padrão da direita para a esquerda.

Tentei primeiro definir a animação de saída quando inicio a atividade da seguinte maneira:

Intent myIntent = new Intent(a, SkdyAlert.class);
    myIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    a.startActivity(myIntent);
    if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT) {
        AnimationHelper.overridePendingTransition(a, R.anim.fadein, R.anim.fadeout);
    }

Então eu tentei fazer isso quando terminar a atividade também

okBtn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            finish();
            if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT) {
                AnimationHelper.overridePendingTransition(activity, 0, R.anim.fadeout);
            }
        }
    });

Mas nenhuma dessas abordagens impedirá o slide da "direita para a esquerda" para a animação de saída. Alguma ideia do que estou fazendo de errado?

Respostas:


228

Eu substituo a transição pendente logo depois de chamar finish ();

No meu caso, fiz isso para evitar transições.

finish();
Details.this.overridePendingTransition(R.anim.nothing,R.anim.nothing);

A ordem é importante :)


5
por "Detalhes", @Goofyahead está nomeando sua atividade envolvente - ymmv. Essa técnica funcionou para mim para substituir uma animação de Theme.Dialog no 2.x, mas não 3.x ou 4.x
— larham1

8
Como é R.anim.nothing?
— sandalone

Use a resposta @Felipe Micaroni Lalli, 0 significa sem animação.
— Yeung

Isso me ajudou também. Explica como definir suas próprias animações: stackoverflow.com/questions/5151591/…
— Adam,

23
Você pode substituir o finish()método para evitar transições em todos os casos (botão Voltar pressionado, como exemplo): @Override public void finish() { super.finish(); overridePendingTransition(0, 0); }
— eugeneek 01 de

29

Esta pergunta já foi respondida, mas a maneira mais eficiente de colocar uma animação ao sair de uma atividade é substituindo o método "terminar ()" da atividade relacionada:

@Override
public void finish() {
    super.finish();
    overridePendingTransition(R.anim.hold, R.anim.slide_out_bottom);
}

24

Eu sugeriria usar o método isFinishing () para configurar as animações em onPause em vez de chamar finish ()

@Override
protected void onPause() {
    super.onPause();
    if (isFinishing()){
        overridePendingTransition(R.anim.activity_slide_in, R.anim.activity_slide_out);
    }

}

Por que isso é melhor?
— Manuel


19

Corrigi esse problema usando este tipo de abordagem:

para abrir com animação:

 Intent newUser = new Intent(getBaseContext(), NewUserActivity.class);
    startActivity(newUser);
    overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_left);

Para fechar com animação:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.slide_out_right,R.anim.slide_in_right);
}

12

Procure fazer isso por meio de um tema. Você pode definir entrar animações de saída para atividades ou para todo o aplicativo


SIM! Foi isso. Bem, mais ou menos. Eu já tinha aplicado um tema, e o tema tinha uma animação definida, por isso não consegui fazer minha própria animação funcionar. Muito obrigado pelo insight!
— b-ryce

3
você pode me dar uma dica de onde olhar quais transições serão entregues pelos temas. Também gostaria de definir uma transição personalizada para todos os sites, mas não sei como.
— LuckyMalaka

@Zapnologica esta outra resposta que dei para uma pergunta semelhante explica um pouco mais. stackoverflow.com/questions/4940574/…
— Nathan Schwermann

6

Seguindo a resposta de @schwiz, aqui está uma substituição de animação para o tema Dialog integrado, onde defini animações slide_up e slide_down locais. Minha atividade especifica o tema MyDialog para que essas transições entrem e saiam.

<style name="Animation.MyDialog" parent="android:Animation.Dialog">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_down</item>
</style>

<style name="Theme.MyDialog" parent="android:Theme.Dialog">
    <item name="android:windowAnimationStyle">@style/Animation.MyDialog</item>
</style>


5

Use startActivityForResult para iniciar sua atividade filho e em onActivityResult () de sua atividade pai:

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode==REQUEST_YOUR_ACTIVITY) {
        overridePendingTransition(R.anim.parent_appearing_anim, R.anim.child_dissmissing_anim);
    }
    super.onActivityResult(requestCode, resultCode, arg2);
}

Isso funciona ao pressionar as costas (botão físico). Para fazer também funcionar com a seta "para cima", consulte esta resposta: /programming/20161234/onactivityresult-is-not-called-when-the-back-button-in-actionbar-is- clicado / 20161352 # 20161352
— lenooh

Importante observar: overridePendingTransition precisa ser chamado antes de chamar super.onActivityResult. Caso contrário, a transição pendint não será cancelada!
— goemic
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.