Transición de actividad en Android


189

¿Cómo puedo definir la transición entre dos actividades para Android 1.5 y posterior? Me gustaría que una actividad se desvaneciera.


77
Se aplica a todas las overridePendingTransitionrespuestas relacionadas a continuación: Puede aprobar (0, 0)si no desea ninguna animación.
dokkaebi

Respuestas:


164

Puedes hacer esto con Activity.overridePendingTransition(). Puede definir animaciones de transición simples en un archivo de recursos XML.


Gracias iandisme. overridePengingTransition es API nivel 5. ¿No es posible hacer esto para el nivel 3 (Android 1.5)?
hpique

Ah, tienes razon. La respuesta de CaseyB es probablemente más similar a lo que estás buscando.
iandisme

Todavía no he encontrado cómo hacer un desvanecimiento adecuado con la respuesta de CaseyB.
hpique

1
Puedes hacer esto en la onCreatefunción de tu Actividad .
mxcl

1
En HTC, debe cambiar la configuración> pantalla> animación a todo para que funcione (o al menos en HTC Desire HD).
Urboss

192

Aquí está el código para hacer un desvanecimiento suave y agradable entre dos actividades.

Crear un archivo llamado fadein.xmlenres/anim

<?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="2000" />

Crear un archivo llamado fadeout.xmlenres/anim

<?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:duration="2000" />

Si desea hacer desaparecer de la Actividad A a la actividad B , ponga la siguiente en el onCreate()método para la actividad B . Antes setContentView()funciona para mí.

overridePendingTransition(R.anim.fadein, R.anim.fadeout);

Si los desvanecimientos son demasiado lentos para usted, cambie android:durationlos archivos xml anteriores a algo más pequeño.


54
Solo para agregar a esto. será necesario volver a llamar a overridePendingTransition (), justo después de que el SO decida cerrar su Actividad. Acabo de poner otra llamada idéntica a overridePendingTransition (fadein, fadeout) en el método onPause () de la actividad. De lo contrario, verá que la Actividad se desvanece, pero no se desvanece cuando se cierra.
Nate

2
No hay respuestas en otro hilo. Lo estoy borrando. Lo que estoy experimentando es que la transición ocurre de inmediato y luego se oscurece y se desvanece. Así que estoy en la Actividad A y se muestra la Actividad B, luego se atenúa y se desvanece. Luego lo modifiqué para seguir las instrucciones con agregue el código a onPause () de la Actividad A y obtenga el mismo comportamiento.
Geeks On Hugs

12
El uso de las animaciones de Android integradas parece dar como resultado una transición más fluida: la overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); visualización de esos archivos también puede darle pistas sobre cómo mejorar sus animaciones personalizadas (por ejemplo, haciendo que el desvanecimiento se prolongue más que el desvanecimiento).
Dan J

3
Simplemente no te olvides de cambiar fadeiny fadeoutpara fade_iny fade_out. Del post de Dan J
Farid

2
Según los documentos, debe llamar overridePendingTransition()inmediatamente después de llamar finish()y / o startActivity(). Pude obtener un buen desvanecimiento de esta manera llamándolo justo después de lanzar la nueva Actividad.
Ionoclast Brigham

50

Una forma incluso fácil de hacerlo es:

  1. Cree un estilo de animación en su archivo styles.xml
<style name="WindowAnimationTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
  1. Agregue este estilo al tema de su aplicación
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

Eso es :)


31

Si. Puede decirle al sistema operativo qué tipo de transición desea tener para su actividad.

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getWindow().setWindowAnimations(ANIMATION);

    ...

}

Donde ANIMATION es un número entero que se refiere a una animación integrada en el sistema operativo.


¿Tengo que hacer algo más para que funcione? getWindow (). setWindowAnimations (android.R.anim.fade_in) no da como resultado la transición de inserción que se usó por defecto, pero tampoco es una transición de desvanecimiento. La nueva actividad solo aparece sobre la anterior en un dispositivo Nexus One.
hpique

1
Eso es porque esto no está pidiendo un recurso, está pidiendo la identificación de una animación de transición integrada en el sistema operativo. developer.android.com/intl/fr/reference/android/view/…
CaseyB

44
Parece que setWindowAnimations solo acepta recursos de estilo. getWindow (). setWindowAnimations (android.R.style.Animation_Toast) es lo más cercano que he encontrado a un desvanecimiento, pero se desvanece del negro, no de la actividad anterior.
hpique

1
No tiene que estar integrado en la animación en el sistema operativo, puede definir uno personalizado en valores.
ilija139

1
@ ilija139, ¿estás seguro? Aquí dice developer.android.com/reference/android/view/… : "Esto debe ser un recurso del sistema; no puede ser un recurso de aplicación porque el administrador de ventanas no tiene acceso a las aplicaciones".
lapis

29

create res> anim> fadein.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" />

create res> anim> fadeout.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:duration="500" />

En res> values> styles.xml

<style name="Fade">
        <item name="android:windowEnterAnimation">@anim/fadein</item>
        <item name="android:windowExitAnimation">@anim/fadeout</item>
    </style>

En actividades onCreate ()

getWindow().getAttributes().windowAnimations = R.style.Fade;

2
¿Sugeriría agregarlo a un tema para que se aplique a todas las actividades?
Peterdk

12
Estas animaciones ya están definidas en Android, simplemente agregue el siguiente código en onPause () de todas las actividades:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava

Sí, solo quería mostrar que la animación se puede editar a gusto de los desarrolladores.
IceSteve


26

Sobreescribo mi animación de actividad predeterminada. Lo pruebo en la API 15 para que funcione sin problemas. Aquí está la solución que uso:

<!-- 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/colorPrimary</item>
    <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>

</style>

<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>

Cree la carpeta anim bajo la carpeta res y luego cree estos cuatro archivos de animación:

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="-100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

Puedes descargar mi proyecto de muestra .

Eso es todo... :)


Esta debería ser la respuesta aceptada. ¡Funciona bien!
EdgeDev

24

Aquí está el código para hacer una buena transición entre dos actividades.

  1. efecto suave de izquierda a derecha

    Cree un archivo llamado slide_in_right.xml y slide_out_right.xml en res / anim

    slide_in_right.xml

        <?xml version="1.0" encoding="utf-8"?>
        <set xmlns:android="http://schemas.android.com/apk/res/android"
            android:shareInterpolator="false" >
            <translate android:duration="5000" android:fromXDelta="100%" android:toXDelta="0%" />
            <alpha android:duration="5000" android:fromAlpha="0.0" android:toAlpha="1.0" />
        </set>

    slide_out_right.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false" >
        <translate android:duration="5000" android:fromXDelta="0%" android:toXDelta="-100%"/>
        <alpha android:duration="5000" android:fromAlpha="1.0" android:toAlpha="0.0" />
    </set>
  2. efecto suave de derecha a izquierda

    Cree un archivo llamado animation_enter.xml y animation_leave.xml en res / anim

    animation_enter.xml

       <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate android:fromXDelta="-100%" android:toXDelta="0%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700"/>
       </set>

    animation_leave.xml

      <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate
            android:fromXDelta="0%" android:toXDelta="100%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700" />
      </set>
  3. Navega de una actividad a la segunda Actividad

       Intent intent_next=new Intent(One_Activity.this,Second_Activity.class);
       overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_right);
       startActivity(intent_next);
     finish();

    4.En el evento de retroceso de prensa o navegue de la segunda actividad a una

     Intent home_intent = new Intent(Second_Activity.this, One_Activity.class);
     overridePendingTransition(R.anim.animation_enter, R.anim.animation_leave);
     startActivity(home_intent);
     finish();

3
El overridePendingTransition debe ser después de startActivity en 3.
arberg

El overridePendingTransition debe ser después de startActivity en 3 y 4
Tareq

No funciona para mí si overridePendingTransition () se coloca antes de startActivity ()
Fernando Tan

Debería llamar overridePendingTransitioninmediatamente después de startActivity: developer.android.com/reference/android/app/…
Midhun MP

4

No puede usar overridePendingTransition en Android 1.5. overridePendingTransistion llegó a Android 2.0.

Si va a pasar por esto sin ningún error, debe compilar para el objetivo (1.5 o superior) utilizando las animaciones ordinarias (o las suyas) o debe compilar para el objetivo (2.0 o superior) utilizando overridePendingTransistion.

Resumen: no puede usar overridePendingTransistion en Android 1.5 .

Sin embargo, puede utilizar las animaciones integradas en el sistema operativo.


Eso no es correcto. Las animaciones están en Android mucho antes de 1.6 y puedes usar overridePendingTransistion con reflexión para seguir apuntando a 1.5.
hpique

Bueno, mi error. Actualicé mi publicación. Seguramente puedes hacer tus propias animaciones y personalizarlas como quieras en 1.5. Pero aún no puede usar overridePendingTransition ya que comenzó a aparecer en el nivel 5 de API.
Cortina del

2

EN dispositivos GALAXY:

Debe asegurarse de no haberlo apagado en el dispositivo usando Configuración> Opciones de desarrollador:

dos muppets


incluso para dispositivos LG :)
Ultimo_m

Creo que sí, pero no lo intento
Maher Ismaail

¡Fantástico! Encontré su respuesta después de varias horas de buscar transiciones y animaciones.
CoolMind

1

Use ActivityCompat.startActivity () funciona API> 21.

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
    ActivityCompat.startActivity(activity, intent, options.toBundle());

1

Antes de comenzar su intención:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(AlbumListActivity.this);
startActivity(intent, options.toBundle());

Esto proporciona animación predeterminada a su transición de actividad.


0

Algunas versiones de Android admiten Activitytransiciones personalizadas y otras no (dispositivos más antiguos). Si desea utilizar transiciones personalizadas, es una buena práctica verificar si Activitytiene el overridePendingTransition()método, ya que en versiones anteriores no lo tiene.

Para saber si el método existe o no, se puede utilizar la API de reflexión. Aquí está el código simple que verificará y devolverá el método si existe:

Method mOverridePendingTransition;

try {
        mOverridePendingTransition = Activity.class.getMethod(
                "overridePendingTransition", new Class[] { Integer.TYPE, Integer.TYPE } );
        /* success */
    } catch (NoSuchMethodException nsme) {
        /* failure, this version of Android doesn't have this method */
    } 

Y luego, podemos aplicar nuestra propia transición, es decir, usar este método si existe:

if (UIConstants.mOverridePendingTransition != null) {
               try {
                   UIConstants.mOverridePendingTransition.invoke(MainActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
               } catch (InvocationTargetException e) {
                   e.printStackTrace();
               } catch (IllegalAccessException e) {
                   e.printStackTrace();
               }
            }

Aquí, como ejemplo, se usaron animaciones simples de entrada y salida para la demostración de transición.


0

alejar la animación

Intent i = new Intent(getApplicationContext(), LoginActivity.class);
 overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
startActivity(i);
finish();

zoom_enter

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

zoom_exit

<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" />
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.