Estoy tratando de animar la transición entre fragmentos. Recibí la respuesta de los siguientes
Fragmentos y animación de Android
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();
Y mi R.anim.slide_in_left
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="50%p" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
Pero cuando probé esto, mostró
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): FATAL EXCEPTION: main
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): java.lang.RuntimeException: Unknown animator name: translate
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:129)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:126)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.loadAnimator(FragmentManager.java:621)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:733)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.BackStackRecord.run(BackStackRecord.java:578)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1217)
¿Algunas ideas? Cuando revisé la referencia de Honeycomb API translate
está allí. ¿Qué me perdí?
¿Hay alguna otra forma de animar la transición entre fragmentos? Gracias
android
android-3.0-honeycomb
Labeeb Panampullan
fuente
fuente
Respuestas:
Debe usar el nuevo
android.animation
marco (animadores de objetos) conFragmentTransaction.setCustomAnimations
y tambiénFragmentTransaction.setTransition
.Aquí hay un ejemplo sobre el uso
setCustomAnimations
de FragmentHideShow.java de ApiDemos :y aquí está el XML animador relevante de res / animator / fade_in.xml :
Tenga en cuenta que puede combinar varios animadores utilizando
<set>
, como lo haría con el marco de animación anterior.EDITAR : Dado que la gente pregunta acerca de deslizar hacia adentro / deslizarse, comentaré sobre eso aquí.
Slide-in y slide-out
Puede animar, por supuesto, los
translationX
,translationY
,x
, yy
propiedades, pero en general se desliza involucrar a la animación de contenido hacia y desde fuera de la pantalla. Hasta donde sé, no hay propiedades de transición que usen valores relativos. Sin embargo, esto no le impide escribirlos usted mismo. Recuerde que las animaciones de propiedades simplemente requieren métodos getter y setter en los objetos que está animando (en este caso, las vistas), por lo que puede crear sus propios métodosgetXFraction
ysetXFraction
métodos en su subclase de vista, de esta manera:Ahora puede animar la propiedad 'xFraction', así:
res / animator / slide_in.xml :
Tenga en cuenta que si el objeto en el que está animando no tiene el mismo ancho que su padre, las cosas no se verán del todo bien, por lo que es posible que deba ajustar la implementación de su propiedad para adaptarla a su caso de uso.
fuente
He hecho de esta manera:
Agregue este método para reemplazar fragmentos con animaciones :
Debe agregar cuatro animaciones en la carpeta anim que está asociada con el recurso :
enter_from_left.xml :
exit_to_right.xml :
enter_from_right.xml :
exit_to_left.xml :
Salida:
Está hecho .
fuente
.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right)
Si puede permitirse atarse solo a Lollipop y más tarde, esto parece ser el truco:
Espero que esto ayude.
fuente
new Slide(...)
: la llamada requiere API nivel 21La respuesta de Nurik fue muy útil, pero no pude hacer que funcionara hasta que encontré esto . En resumen, si está utilizando la biblioteca de compatibilidad (por ejemplo, SupportFragmentManager en lugar de FragmentManager), la sintaxis de los archivos de animación XML será diferente.
fuente
Aquí hay una animación de entrada / salida de diapositivas entre fragmentos:
Estamos usando un objectAnimator.
Aquí están los dos archivos xml en la subcarpeta del animador .
enter_anim.xml
exit_anim.xml
Espero que eso ayude a alguien.
fuente
.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right, R.animator.slide_in_left, R.animator.slide_out_right)
Para cualquier otra persona que quede atrapada, asegúrese de llamar a setCustomAnimations antes de la llamada para reemplazar / agregar al crear la transacción.
fuente
La implementación de Android SDK de FragmentTransaction quiere un
Animator
tiempo mientras que la biblioteca de soporte quiere unAnimation
, no me pregunten por qué, pero después del comentario de strangeluk busqué en el código de Android 4.0.3 y la biblioteca de soporte. Usos del SDK de AndroidloadAnimator()
y usos de la biblioteca de soporteloadAnimation()
fuente
Intente usar esta solución simple y en ayunas. Android proporciona algunos
animation
s predeterminados .Salida:
fuente