Fragmentos de Android y animación.
¿Cómo debería implementar el tipo de deslizamiento que utiliza, por ejemplo, el cliente Honeycomb Gmail?
Puede TransactionManager
manejar 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 :)
Para animar la transición entre fragmentos, o para animar el proceso de mostrar u ocultar un fragmento, utiliza Fragment Manager
para 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.show
o ft.hide
, pasando el Fragmento que desea mostrar u ocultar respectivamente.
Como referencia, las definiciones de animación XML usarían la objectAnimator
etiqueta. 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>
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_shortAnimTime
o 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.