¿Cómo puedo agregar una animación al final de la actividad ()


98

Estoy usando overridePendingTransition para cuando se crea mi actividad y eso funciona bien, puedo ver que el fundido funciona muy bien, pero cuando intento animar el final de la actividad, todavía está haciendo la diapositiva predeterminada de derecha a izquierda.

Primero intenté definir la animación de salida cuando inicio la actividad de la siguiente manera:

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);
    }

Luego intenté hacerlo cuando termine la actividad también

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);
            }
        }
    });

Pero ninguno de estos enfoques evitará el deslizamiento "de derecha a izquierda" para la animación de salida. ¿Alguna idea de lo que estoy haciendo mal?

Respuestas:


228

Anulo la transición pendiente justo después de llamar a finish ();

En mi caso lo he hecho para evitar transiciones.

finish();
Details.this.overridePendingTransition(R.anim.nothing,R.anim.nothing);

El orden es importante :)


5
por "Detalles", @Goofyahead está nombrando su Actividad adjunta - ymmv. Esta técnica funcionó para mí para reemplazar una animación de Theme.Dialog en 2.x, pero no 3.xo 4.x
larham1

8
¿Cómo se R.anim.nothingve?
sandalone

Utilice la respuesta de @Felipe Micaroni Lalli, 0 significa que no hay animación.
Yeung

Esto también me ayudó. Explica cómo definir sus propias animaciones: stackoverflow.com/questions/5151591/…
Adam

23
Puede anular el finish()método para evitar transiciones en todos los casos (botón de retroceso presionado, como muestra): @Override public void finish() { super.finish(); overridePendingTransition(0, 0); }
eugeneek

29

Esta pregunta ya se ha respondido, pero la forma más eficaz de poner una animación al salir de una actividad es anulando el método "finish ()" de la actividad relacionada:

@Override
public void finish() {
    super.finish();
    overridePendingTransition(R.anim.hold, R.anim.slide_out_bottom);
}

24

Sugeriría usar el método isFinishing () para configurar las animaciones en onPause en lugar de llamar a finish ()

@Override
protected void onPause() {
    super.onPause();
    if (isFinishing()){
        overridePendingTransition(R.anim.activity_slide_in, R.anim.activity_slide_out);
    }

}

¿Por qué es mejor?
Manuel


19

Solucioné este problema usando este tipo de enfoque:

para abrir con animación:

 Intent newUser = new Intent(getBaseContext(), NewUserActivity.class);
    startActivity(newUser);
    overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_left);

Para cerrar con animación:

@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

Busque hacerlo a través de un tema. Puede definir animaciones de entrada de salida para actividades o para toda la aplicación


¡SI! Eso fue todo. Así un poco. Ya había aplicado un tema y el tema tenía una animación definida, por eso no pude hacer funcionar mi propia animación. ¡Muchas gracias por la información!
b-ryce

3
¿Puede darme una pista sobre dónde buscar qué transiciones serán entregadas por los temas? También me gustaría establecer una transición personalizada para todos los sitios, pero no sé cómo.
LuckyMalaka

@Zapnologica esta otra respuesta que di para una pregunta similar lo explica un poco más. stackoverflow.com/questions/4940574/…
Nathan Schwermann

6

Siguiendo la respuesta de @schwiz, aquí hay una anulación de animación para el tema de diálogo incorporado, donde he definido las animaciones slide_up y slide_down locales. Mi actividad especifica el tema MyDialog para que estas transiciones entren y salgan.

<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

Utilice startActivityForResult para iniciar la actividad de su hijo y en onActivityResult () de su actividad principal:

    @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);
}

Esto funciona al presionar hacia atrás (botón físico). Para que también funcione con la flecha "hacia arriba", consulte esta respuesta: /programming/20161234/onactivityresult-is-not-called-when-the-back-button-in-actionbar-is- clicked / 20161352 # 20161352
lenooh

Importante tener en cuenta: se debe llamar a overridePendingTransition antes de llamar a super.onActivityResult. De lo contrario, la transición pendint no se anulará.
goemic
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.