¿Cómo realizar una animación de fundido en la transición de actividad?

89

Estoy codificando un efecto de transición entre la actividad de mi logotipo y mi actividad principal, pero tengo el problema de que antes de desaparecer la actividad se mueve hacia arriba:

<?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>

¿Cómo podría mejorar este código para obtener solo un efecto de desvanecimiento?

MarcForn
fuente

Respuestas:

237

Puede crear sus propios archivos de animación .xml para fundir en uno nuevo Activityy desaparecer en el actual 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" />

Úselo en un código como ese: (Dentro de su Activity)

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

El código anterior se desvanecerá en el actual activo Activityy se desvanecerá en el recién iniciado, Activitylo que dará como resultado una transición suave.

ACTUALIZACIÓN : @Dan J señaló que el uso de las animaciones de Android integradas mejora el rendimiento , que de hecho descubrí que era el caso después de hacer algunas pruebas. Si prefiere trabajar con las animaciones integradas, use:

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

Observe que hago referencia en android.Rlugar de Racceder a la identificación del recurso.

ACTUALIZACIÓN : ahora es una práctica común realizar transiciones utilizando la clase Transición introducida en el nivel de API 19 .

Philipp Jahoda
fuente
65
El uso de las animaciones de Android integradas parece dar como resultado una transición más suave: overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout);ver esos archivos también puede darle pistas sobre cómo mejorar sus animaciones personalizadas (por ejemplo, haciendo que el desvanecimiento dure más tiempo que el desvanecimiento).
Dan J
41
Tiene un nodescore: overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);:)
AlvaroSantisteban
¿Tengo que usar overridePendingTransition onCreate o en cada Intent? ¿O depende de lo que quiera? Gracias.
Ricardo
19
Hay una opción sin "anular":Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); startActivity(intent, bundle);
oleynikd
1
La transición anterior se ejecuta solo si está habilitada en las opciones de desarrollador, consulte stackoverflow.com/a/30422015/2914140 .
CoolMind
22

Simplemente vuelva a publicar la respuesta de oleynikd porque es simple y ordenada

Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),
    android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
startActivity(intent, bundle);
Nikhil
fuente
Dado que overridePendingTransition no funciona en algunos móviles y la solución de Enes no es muy buena, esta respuesta debería ser la correcta.
Hugo Passos
19

También puede agregar animación en su actividad, en el método onCreate como a continuación, porque overridePendingTransition no funciona con algunos dispositivos móviles, o depende de la configuración del 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
fuente
1
¿Cómo manejar la animación de la actividad anterior o de los padres?
Mehmed
9
Para configurar la animación para la transición de regreso a la actividad principal, use este código: @Override public void onBackPressed() { super.onBackPressed(); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); }
John Verco
15

también puede usar este código en su archivo style.xml para que no necesite escribir nada más en su actividad.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
fuente