TL; DR: Estoy buscando una muestra de trabajo completa de lo que denominaré "el escenario de animación de tres fragmentos de Gmail". Específicamente, queremos comenzar con dos fragmentos, como este:
En algún evento de IU (por ejemplo, tocando algo en el Fragmento B), queremos:
- Fragmento A para deslizarse fuera de la pantalla hacia la izquierda
- Fragmento B para deslizarse hacia el borde izquierdo de la pantalla y reducir para ocupar el lugar desocupado por el Fragmento A
- Fragmento C para deslizarse desde el lado derecho de la pantalla y ocupar el lugar desocupado por el Fragmento B
Y, al presionar el botón ATRÁS, queremos que se revierta ese conjunto de operaciones.
Ahora, he visto muchas implementaciones parciales; Revisaré cuatro de ellos a continuación. Más allá de estar incompletos, todos tienen sus problemas.
@Reto Meier contribuyó con esta respuesta popular a la misma pregunta básica, indicando que usaría setCustomAnimations()
con a FragmentTransaction
. Para un escenario de dos fragmentos (por ejemplo, solo ve el Fragmento A inicialmente y desea reemplazarlo por un nuevo Fragmento B que usa efectos animados), estoy totalmente de acuerdo. Sin embargo:
- Dado que solo puede especificar una animación de "entrada" y una de "salida", no puedo ver cómo manejaría todas las animaciones diferentes requeridas para el escenario de tres fragmentos
- El
<objectAnimator>
código en su muestra utiliza posiciones cableadas en píxeles, y eso parecería poco práctico dados los diferentes tamaños de pantalla, perosetCustomAnimations()
requiere recursos de animación, lo que impide la posibilidad de definir estas cosas en Java - Estoy en una pérdida en cuanto a cómo los animadores de objeto para lazo escala en con cosas como
android:layout_weight
en unaLinearLayout
de asignación de espacio en una base porcentual - Estoy en una pérdida en cuanto a cómo Fragmento C se maneja desde el principio (
GONE
?android:layout_weight
De0
? Pre-animado a una escala de 0? Otra cosa?)
@Roman Nurik señala que puede animar cualquier propiedad , incluidas las que usted mismo defina. Eso puede ayudar a resolver el problema de las posiciones cableadas, a costa de inventar su propia subclase de administrador de diseño personalizado. Eso ayuda a algunos, pero todavía estoy desconcertado por el resto de la solución de Reto.
El autor de esta entrada de Pastebin muestra un pseudocódigo tentador, básicamente diciendo que los tres fragmentos residirían inicialmente en el contenedor, con el Fragmento C oculto al principio a través de una hide()
operación de transacción. Luego, show()
C y hide()
A cuando ocurre el evento UI. Sin embargo, no veo cómo eso maneja el hecho de que B cambia de tamaño. También se basa en el hecho de que aparentemente puede agregar múltiples fragmentos al mismo contenedor, y no estoy seguro de si ese es un comportamiento confiable a largo plazo (sin mencionar que debería romperse findFragmentById()
, aunque puedo vivir con eso).
El autor de esta publicación de blog indica que Gmail no está utilizando setCustomAnimations()
en absoluto, sino que utiliza directamente animadores de objetos ("simplemente cambia el margen izquierdo de la vista raíz + cambia el ancho de la vista derecha"). Sin embargo, esta sigue siendo una solución AFAICT de dos fragmentos, y la implementación muestra una vez más las dimensiones de los cables duros en píxeles.
Continuaré desconectando de esto, así que quizás termine respondiendo esto algún día, pero realmente espero que alguien haya resuelto la solución de tres fragmentos para este escenario de animación y pueda publicar el código (o un enlace al mismo). Las animaciones en Android me dan ganas de arrancarme el pelo, y aquellos de ustedes que me han visto saben que este es un esfuerzo en gran medida infructuoso.