En jouant avec MotionLayouts dans un RecyclerView, j'ai remarqué que les MotionLayouts n'animeraient pas l'enroulement autour de leurs enfants s'il leur arrivait de changer de hauteur.
Un moyen simple de reproduire ce comportement serait avec la disposition suivante:
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Android.support.constraint.motion.MotionLayout
Android:id="@+id/motion_container"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@color/colorPrimary"
app:layoutDescription="@xml/scene">
<View
Android:id="@+id/child"
Android:layout_width="0dp"
Android:layout_height="200dp"
Android:background="@color/colorAccent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</Android.support.constraint.motion.MotionLayout>
</FrameLayout>
Et le MotionScene associé au déclencheur OnClick:
<MotionScene xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:motion="http://schemas.Android.com/apk/res-auto">
<Transition
motion:constraintSetEnd="@id/end"
motion:constraintSetStart="@id/start"
motion:duration="1000">
<OnClick
motion:target="@id/child"
motion:mode="toggle"/>
</Transition>
<ConstraintSet Android:id="@+id/start">
<Constraint
Android:id="@id/child"
Android:layout_height="200dp"/>
</ConstraintSet>
<ConstraintSet Android:id="@+id/end">
<Constraint
Android:id="@id/child"
Android:layout_height="400dp"/>
</ConstraintSet>
</MotionScene>
Ce qui donnerait le résultat suivant:
Comme vous pouvez le voir, la hauteur de MotionLayout est définie sur la hauteur finale attendue dès le début de la transition, ce qui rend son arrière-plan bleu visible jusqu'à ce que la vue enfant termine sa propre transition de hauteur et la chevauche complètement.
La même chose se produit dans un RecyclerView si vous essayez d'implémenter une animation d'élément à dépenser.
Y aurait-il un moyen de faire en sorte que MotionLayout s'adapte exactement à la hauteur de ses enfants pendant les transitions ou est-ce que cela serait tout simplement trop rentable?
Évitez de redimensionner les limites de MotionLayout. Au lieu de cela, agrandissez-le et n'animez que la taille de vos objets enfants. Vous pouvez rendre la zone vide transparente et transmettre des événements tactiles aux vues sous-jacentes.
Source et exemple: https://medium.com/vrt-digital-studio/picture-in-picture-video-overlay-with-motionlayout-a9404663b9e7