web-dev-qa-db-fra.com

MotionLayout et ConstraintLayout ne s'animent pas autour de la hauteur des enfants

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:

Behaviour demonstration

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?

11
krow

É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

1
RWIL