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.