¿Cómo proporcionar animación al llamar a otra actividad en Android?

115

Tengo dos Actividades A y B. Quiero tener la animación encogida cuando la Actividad A llama a B y maximizar la animación cuando la Actividad B llama A. No necesito los archivos xml de animación para esto.

Cuando llamamos a otra actividad en Android, da su animación predeterminada y luego llama a la animación de reducción.

Lo que quiero es que no se produzca la animación predeterminada y que se produzca la animación que quiero.

¿Podemos realmente dar la animación al llamar a otra actividad?

Sunil
fuente

Respuestas:

144

Desde API 16, puede proporcionar un paquete de opciones de actividad al llamar a Context.startActivity (Intent, Bundle) o métodos relacionados. Se crea a través del constructor ActivityOptions :

Intent myIntent = new Intent(context, MyActivity.class);
ActivityOptions options = 
   ActivityOptions.makeCustomAnimation(context, R.anim.fade_in, R.anim.fade_out);
context.startActivity(myIntent, options.toBundle());

No olvide consultar los otros métodos del constructor ActivityOptions y ActivityOptionsCompat si está utilizando la biblioteca de soporte.



API 5+:

Para las aplicaciones orientadas al nivel de API 5+, existe el overridePendingTransitionmétodo Actividades . Se necesitan dos ID de recursos para las animaciones entrantes y salientes. Un id de 0deshabilitará las animaciones. Llame a esto inmediatamente después de la startActivityllamada.

es decir:

startActivity(new Intent(this, MyActivity.class));
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

API 3+:

Puede evitar la animación predeterminada (deslice desde la derecha) con la Intent.FLAG_ACTIVITY_NO_ANIMATIONbandera en su intención.

es decir:

Intent myIntent = new Intent(context, MyActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
context.startActivity(myIntent);

luego en tu Actividad simplemente tienes que especificar tu propia animación.

Esto también funciona para la API 1.5 (nivel 3).

whlk
fuente
4
¿A qué te refieres cuando dices "especifica tu propia animación"? ¿Cómo haces esto? ¡Gracias!
pqn
Tengo la misma pregunta. Probablemente en la animación de inicio en onResume y onPause.
Tima
¿Hay alguna forma de usar Animator en su lugar?
desarrollador de Android
¡También puede usar lo mismo después de llamar a finish ()!
thiagolr
¿No es R.anim.fade_intodavía una animación de archivo xml que suponemos tener res\anim ?
Alex Jolig
78

Debe usar el método OverridePendingTransition para lograrlo, que se encuentra en la clase Activity . Animaciones de muestra en la carpeta res / anim del ejemplo de apidemos. Revisalo. Más que ver la demostración en ApiDemos / App / Activity / animation .

Ejemplo:

@Override
public void onResume(){
    // TODO LC: preliminary support for views transitions
    this.overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
}
Praveen
fuente
1
Gracias por la respuesta. El método overridePendingTransition es compatible con el nivel de API 5 y quiero que la aplicación sea compatible con Android 1.5. ¿Existe alguna otra forma de proporcionar animación de una actividad a otra?
domingo
5
¡increíble! esto es muy divertido para jugar con
alguien en algún lugar
@sunil tengo la misma pregunta que la tuya. ¿Podrías resolver el problema? Animación con api nivel 3 o 4 (no 5)
Dr.jacky
mantener el código de animación en onResume () hará que la animación se reproduzca cuando el usuario salga de la aplicación y regrese. No es ideal en muchas aplicaciones.
Vihaan Verma
Necesitaba agregar super.onResume();, estaba obteniendo: "android.util.SuperNotCalledException: Activity {com.abc.MyActivity} no llamó a super.onResume ()"
Gene Bo
3

Jelly Bean agrega soporte para esto con el método ActivityOptions.makeCustomAnimation () . Por supuesto, dado que solo está en Jelly Bean, es prácticamente inútil para fines prácticos.

phreakhead
fuente
5
Ya no es inútil :)
Greg Ennis
Úselo ActivityOptionsCompatsi tiene como objetivo pre-JellyBean.
Thuy Trinh