Android Fragmentos y animación

¿Cómo debe implementar el tipo de deslizamiento que, por ejemplo, el cliente Honeycomb Gmail utiliza?

TransactionManager puede manejar esto automáticamente mediante la adición y la eliminación de los fragmentos, es algo difícil de probar esto debido a que el emulador es una presentación de diapositivas 🙂

Para animar la transición entre fragmentos o para animar el proceso de mostrar u ocultar un fragmento, utilice el Fragment Manager para crear una Fragment Transaction .

Dentro de cada transacción de fragmentos puede especificar animaciones de entrada y salida que se utilizarán para mostrar y ocultar respectivamente (o ambos cuando se utilice reemplazar).

El siguiente código muestra cómo reemplazar un fragmento deslizando un fragmento y deslizando el otro en su lugar.

 FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); DetailsFragment newFragment = DetailsFragment.newInstance(); ft.replace(R.id.details_fragment_container, newFragment, "detailFragment"); // Start the animated transition. ft.commit(); 

Para lograr lo mismo con ocultar o mostrar un fragmento que simplemente llamaría ft.show o ft.hide , pasando en el fragmento que desea mostrar u ocultar, respectivamente.

Para referencia, las definiciones de animación XML utilizarían la etiqueta objectAnimator . Un ejemplo de slide_in_left podría ser algo como esto:

 <?xml version="1.0" encoding="utf-8"?> <set> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:propertyName="x" android:valueType="floatType" android:valueFrom="-1280" android:valueTo="0" android:duration="500"/> </set> 

Si no tienes que usar la biblioteca de soporte, echa un vistazo a la respuesta de Roman .

Pero si quieres usar la biblioteca de soporte , tienes que usar el antiguo framework de animación como se describe a continuación.

Después de consultar las respuestas de Reto y blindstuff he conseguido el siguiente código funcionando.

Los fragmentos aparecen deslizándose hacia adentro desde la derecha y deslizándose hacia la izquierda cuando se presiona.

 FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit); CustomFragment newCustomFragment = CustomFragment.newInstance(); transaction.replace(R.id.fragment_container, newCustomFragment ); transaction.addToBackStack(null); transaction.commit(); 

La orden es importante. Esto significa que debe llamar a setCustomAnimations() antes de replace() o la animación no tendrá efecto!

A continuación, estos archivos deben colocarse dentro de la carpeta res / anim .

Enter.xml :

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

Exit.xml :

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

Pop_enter.xml :

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

Pop_exit.xml :

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

La duración de las animaciones se puede cambiar a cualquiera de los valores predeterminados como @android:integer/config_shortAnimTime o cualquier otro número.

Tenga en cuenta que si entre los reemplazos de fragmentos se produce un cambio de configuración (por ejemplo, rotación), la acción posterior no está animada. Se trata de un error documentado que aún existe en la rev 20 de la biblioteca de soporte.

Mi biblioteca de soporte modificada admite el uso de las animaciones View (es decir, <translate>, <rotate> ) y Object Animators (es decir, <objectAnimator> ) para Fragment Transitions. Se implementa con NineOldAndroids . Consulte mi documentación en github para más detalles.

Yo soluciono esto de la manera Abajo

 Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide); fg.startAnimation(anim); this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment 
  • Cómo cerrar el fragmento actual mediante el botón como el botón Volver?
  • Añadir acción de botón en la notificación personalizada
  • Cambiar la barra de herramientas y la barra de herramientas CollapsingToolbarLayout mediante programación
  • Async tarea dentro de los fragmentos durante la pantalla oreintation
  • Fragmentos vs. TabActivity obsoleto en un dispositivo pre 3.0
  • Android oncreateview llamado dos veces
  • Android 4.2: comportamiento de la pila trasera con fragmentos anidados
  • La barra de herramientas de AppCompat v7 no funciona
  • Obtener SupportFragmentManager sin extender FragmentActivity
  • Implementación de BackStack para Fragmentos en las pestañas de Android
  • Los fragmentos ViewPager no se inician en onCreate
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.