Fragmentos de Android y animación.

Resuelto alexanderblom asked hace 54 años • 6 respuestas

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

Puede TransactionManagermanejar esto automáticamente agregando y eliminando Fragmentos, es un poco difícil probar esto debido a que el emulador es una presentación de diapositivas :)

alexanderblom avatar Jan 01 '70 08:01 alexanderblom
Aceptado

Para animar la transición entre fragmentos, o para animar el proceso de mostrar u ocultar un fragmento, utiliza Fragment Managerpara crear un archivo Fragment Transaction.

Dentro de cada transacción de fragmento, puede especificar animaciones de entrada y salida que se usarán para mostrar y ocultar respectivamente (o ambas cuando se usa reemplazar).

El siguiente código muestra cómo reemplazaría un fragmento deslizando un fragmento hacia afuera 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 al ocultar o mostrar un fragmento, simplemente llamaría ft.showo ft.hide, pasando el Fragmento que desea mostrar u ocultar respectivamente.

Como referencia, las definiciones de animación XML usarían la objectAnimatoretiqueta. Un ejemplo de slide_in_left podría verse así:

<?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>
Reto Meier avatar Jan 27 '2011 17:01 Reto Meier

Si no tiene que utilizar la biblioteca de soporte, eche un vistazo a la respuesta de Roman .

Pero si desea utilizar la biblioteca de soporte, debe utilizar el antiguo marco de animación como se describe a continuación.

Después de consultar las respuestas de Reto y Blindstuff, el siguiente código funcionó.

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

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

El orden es importante. ¡ Esto significa que debes llamar setCustomAnimations()antes replace()o la animación no tendrá efecto!

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

ingresar.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>

salida.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_shortAnimTimeo cualquier otro número.

Tenga en cuenta que si entre reemplazos de fragmentos se produce un cambio de configuración (por ejemplo, rotación), la acción de retroceso no se anima. Este es un error documentado que todavía existe en la revisión 20 de la biblioteca de soporte.

dmanargias avatar Jul 05 '2013 12:07 dmanargias