Como realizar uma animação de fade na transição de atividade?

89

Estou codificando um efeito de transição entre minha atividade de logotipo e minha atividade principal, mas tenho o problema de que antes de desaparecer a atividade vá para o topo:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

    <alpha
        android:duration="2000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" >
    </alpha>

</set>

Como eu poderia melhorar este código para obter apenas um efeito de desaparecimento?

MarcForn
fonte

Respostas:

239

Você pode criar seus próprios arquivos de animação .xml para Activityaparecer um novo e desaparecer o atual Activity:

fade_in.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
           android:interpolator="@android:anim/accelerate_interpolator"
           android:fromAlpha="0.0" android:toAlpha="1.0"
           android:duration="500" />

fade_out.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
           android:interpolator="@android:anim/accelerate_interpolator"
           android:fromAlpha="1.0" android:toAlpha="0.0"
           android:fillAfter="true"
           android:duration="500" />

Use-o em um código como este: (dentro do seu Activity)

Intent i = new Intent(this, NewlyStartedActivity.class);
startActivity(i);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

O código acima irá desaparecer o que está ativo no momento Activitye aumentar o recém-iniciado, Activityresultando em uma transição suave.

ATUALIZAÇÃO : @Dan J apontou que usar as animações embutidas do Android melhora o desempenho , o que eu realmente descobri ser o caso depois de fazer alguns testes. Se você preferir trabalhar com as animações integradas, use:

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

Observe que estou fazendo referência em android.Rvez de Racessar a id do recurso.

ATUALIZAÇÃO : agora é uma prática comum realizar transições usando a classe Transition introduzida na API de nível 19 .

Philipp Jahoda
fonte
65
Usar as animações integradas do Android parece resultar em uma transição mais suave: a overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout);visualização desses arquivos também pode dar dicas sobre como melhorar suas animações personalizadas (por exemplo, fazendo o fade in durar mais do que o fade out).
Dan J de
42
Tem undescore: overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);:)
AlvaroSantisteban
Devo usar overridePendingTransition onCreate ou em todos os Intent? Ou depende do que eu quero? Obrigado.
Ricardo
19
Há uma opção sem "substituir":Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); startActivity(intent, bundle);
oleynikd
1
A transição acima é executada apenas se habilitada nas opções do desenvolvedor, consulte stackoverflow.com/a/30422015/2914140 .
CoolMind
22

Apenas republico a resposta de oleynikd porque é simples e organizado

Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),
    android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
startActivity(intent, bundle);
Nikhil
fonte
Já que overridePendingTransition não funciona em alguns celulares e a solução da Enes não é muito boa, esta resposta deve ser a correta.
Hugo Passos
19

você também pode adicionar animação em sua atividade, no método onCreate como abaixo porque overridePendingTransition não está funcionando com alguns dispositivos móveis, ou depende das configurações do dispositivo ...

View view = findViewById(android.R.id.content);
Animation mLoadAnimation = AnimationUtils.loadAnimation(getApplicationContext(), android.R.anim.fade_in);
mLoadAnimation.setDuration(2000);
view.startAnimation(mLoadAnimation);
Enes
fonte
1
Como lidar com a animação da atividade anterior ou principal?
Mehmed
9
Para definir a animação da transição de volta à atividade pai, use este código: @Override public void onBackPressed() { super.onBackPressed(); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); }
John Verco,
15

você também pode usar este código em seu arquivo style.xml para que não precise escrever mais nada em seu activity.java

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowAnimationStyle">@style/AppTheme.WindowTransition</item>
</style>

<!-- Setting window animation -->
<style name="AppTheme.WindowTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
Refnhaldy
fonte