web-dev-qa-db-fra.com

Changer de manière programmatique Attribut de contrainte dans la scène de mouvement de MotionLayout

J'ai un cas d'utilisation où je veux créer YouTube comme animation à l'aide de MotionLayout. Il y a un échantillon pour cette animation dans this repo. Mais le problème est que dans cet exemple, ils utilisent une hauteur statique pour la contrainte de départ comme celle-ci 320dp:

<MotionScene...>

    <Transition..>

        <OnSwipe... />

        <ConstraintSet Android:id="@id/start">

            <Constraint
                Android:id="@id/top_image_container"
                Android:layout_width="0dp"
                Android:layout_height="320dp"
                motion:layout_constraintTop_toTopOf="parent"
                motion:layout_constraintStart_toStartOf="parent"
                motion:layout_constraintEnd_toEndOf="parent"  />

      </ConstraintSet>
  </Transition>
</MotionScene>

Mais mon besoin de définir des contraintes à l'aide du rapport de format. Pour un rapport d'image statique, je peux définir à l'aide de app:layout_constraintDimensionRatio="w,16:9" Dans la contrainte comme celle-ci.

<Constraint
    Android:id="@id/top_image_container"
    Android:layout_width="0dp"
    Android:layout_height="0dp"
    motion:layout_constraintTop_toTopOf="w,16:9"
    motion:layout_constraintTop_toTopOf="parent"
    motion:layout_constraintStart_toStartOf="parent"
    motion:layout_constraintEnd_toEndOf="parent"  />

Mais chaque vidéo a un rapport d'aspect différent que je reçois d'API.SO Je souhaite définir un rapport de format différent en fonction de la vidéo. Je ne suis pas en mesure de trouver un moyen de définir cette programmation dans le ConstraintSet

J'ai essayé une solution de contournement pour définir Android:layout_height="wrap_content" Et changer le ratio de format de vue programmatiquement. Mais cela n'a pas fonctionné et l'animation ne fonctionnait pas correctement.

Toute solution ou suggestion serait appréciée.

9
Burhanuddin Rashid

Ce que vous pouvez faire est d'accéder à ConstraintSet puis définissez le ratio:

motionLayout.getConstraintSet(R.id.start)?.let { startConstraintSet ->
    val ratio = imageView.calculateRatio()
    startConstraintSet.setDimensionRatio(R.id.top_image_container, ratio)
    // You can set the width and height here as well
}
7
jossiwolf