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

b-ryce
fuente

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 :)

Goofyahead
fuente
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);
}
Bahadir Tasdemir
fuente
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);
    }

}
Pablo A. Martínez
fuente
¿Por qué es mejor?
Manuel
20
finish();
overridePendingTransition(0, 0);
Felipe
fuente
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);
}
Deivison Sporteman
fuente
12

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

Nathan Schwermann
fuente
¡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>

larham1
fuente
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);
}
Chris.Zou
fuente
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