Android: cómo animar una transición de actividad cuando se pulsa el botón de retroceso predeterminado

En mi actividad, tengo un botón con el siguiente oyente de clics que está funcionando muy bien:

final ImageButton startOverButton = (ImageButton) findViewById(R.id.start_over_button); startOverButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(final View v) { finish();//go back to the previous Activity overridePendingTransition(R.anim.comming_in, R.anim.comming_out); } }); 

Anima el regreso a la actividad anterior de la manera que quiero. Sin embargo, cuando el usuario presiona el botón de retroceso predeterminado de Android, la animación no se activa. Mi pregunta es: ¿dónde debo poner el código de animación overridePendingTransition (R.anim.comming_in, R.anim.comming_out); De modo que esta animación se disparará tanto cuando el usuario hace clic en mi botón y en el botón de retroceso de Android por defecto?

Como un intento ingenuo, he intentado poner el overridePendingTransition (R.anim.comming_in, R.anim.comming_out); Línea de código en el método onDestroy () , pero no funcionó.

¡Gracias de antemano!

4 Solutions collect form web for “Android: cómo animar una transición de actividad cuando se pulsa el botón de retroceso predeterminado”

Tal vez usted puede hacer este trabajo en el método onBackPressed () en la actividad.

 @Override public void onBackPressed() { super.onBackPressed(); overridePendingTransition(R.anim.comming_in, R.anim.comming_out); } 

Básicamente el overBackPressed es un enfoque apropiado, pero en lugar de call finish () de él, diría que es mejor llamar a super.onBackPressed () y luego agregar overridePendingTransition por lo que son un poco más consistente con las reglas de herencia.

 @Override public void onBackPressed() { super.onBackPressed(); overridePendingTransition(R.anim.comming_in, R.anim.comming_out); } 

Si utiliza fragmento puede proceder de la siguiente manera:

 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.anim.anim_slide_in_left, R.anim.anim_slide_out_left, R.anim.anim_slide_out_right, R.anim.anim_slide_in_right); transaction.replace(R.id.fragment_container, new YourClassFragment); transaction.addToBackStack(null); transaction.commit(); 

Anim_slide_in_left

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

Anim_slide_out_left

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

Anim_slide_out_right

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

Anim_slide_in_right

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

A pesar de que onBackPressed() es una buena opción, sugeriría anular el método finish() , en caso de que la actividad se termine de alguna otra manera, como una acción de navegación o cualquier otra acción de vista que "destruya" la actividad:

 @Override public void finish() { super.finish(); overridePendingTransition(0,0); } 

Tenemos que tener en cuenta que este método se activará después de que el botón de retroceso se ha presionado, por lo que estamos bien para ir 🙂

Actualización : Además, la onBackPressed() podría estropear la Actividad si estamos usando fragmentos en ella, porque probablemente no queremos anular las transiciones cada vez que se presiona la parte de atrás.

  • Transición de elemento compartido (primer plano / fondo)
  • Android NYTimes Swipe Animation / Gesto
  • Android elementos compartidos transición pre-21
  • OverridePendingTransition no funciona cuando se utiliza FLAG_ACTIVITY_REORDER_TO_FRONT
  • Efectos de transición con Android ImageView
  • Android: ¿No hay transición entre las actividades?
  • ¿Cómo puedo repetir una transición para siempre?
  • Android RecyclerView - animar la elevación del elemento al tocar
  • Android Google IO 2014: ¿Cómo implementar la transición de la actividad con fragmentos?
  • Conversión de imagen a vídeo con efecto de transición
  • ¿Hay una manera de llamar `overridePendingTransition` de una clase que no extiende la clase Activity?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.