trabajar - java android fragment
Fragmentos de Android y animaciĆ³n. (5)
¿Cómo debería implementar el tipo de deslizamiento que, por ejemplo, utiliza el cliente de Honeycomb Gmail?
¿Puede TransactionManager
manejar esto automáticamente al agregar y eliminar los Fragmentos? Es un poco difícil probarlo porque el emulador es una presentación de diapositivas :)
Mi biblioteca de soporte modificada admite el uso de animaciones de vista (es decir, <translate>, <rotate>
) y animadores de objetos (es decir, <objectAnimator>
) para las transiciones de fragmentos. Se implementa con NineOldAndroids . Consulte mi documentación en github para más detalles.
Para animar la transición entre fragmentos, o para animar el proceso de mostrar u ocultar un fragmento, use Fragment Manager
para crear una Fragment Transaction
.
Dentro de cada Transacción de fragmentos, puede especificar animaciones de entrada y salida que se usarán para mostrar y ocultar respectivamente (o ambas cuando se use reemplazar).
El siguiente código muestra cómo reemplazaría un fragmento al deslizar un fragmento y al 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 ocultando o mostrando un fragmento que simplemente llamaría ft.show
o ft.hide
, pase el Fragmento que desea mostrar u ocultar respectivamente.
Para referencia, las definiciones de animación XML usarían la etiqueta objectAnimator
. 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>
Por favor, use esto, creo que soluciones mucho mejores. Android Studio proporciona animation
predeterminada.
fragmentTransaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.replace(R.id.frame, firstFragment, "h");
fragmentTransaction.addToBackStack("h");
fragmentTransaction.commit();
Salida:
Resuelvo esto de la siguiente manera.
Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment
Si no tiene que usar la biblioteca de soporte, eche un vistazo a Roman''s respuesta Roman''s .
Pero si desea usar la biblioteca de soporte , debe usar el marco de animación antiguo como se describe a continuación.
Después de consultar blindstuff''s respuestas de Reto''s y de blindstuff''s he conseguido que el siguiente código funcione.
Los fragmentos aparecen deslizándose desde la derecha y deslizándose hacia la izquierda cuando se presiona la parte posterior.
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 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, la rotación), la acción de retroceso no se anima. Este es un error documentado que todavía existe en la versión 20 de la biblioteca de soporte.