在MotionLayout的运动场景中以编程方式更改ConstraintSet属性

时间:2019-02-26 04:12:54

标签: android android-layout android-constraintlayout android-motionlayout

我有一个用例,我想使用MotionLayout创建类似动画的Youtube。 this存储库中有此动画的示例。 但是问题在于,在此示例中,他们将静态高度用于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>

但是我要求使用宽高比设置约束。对于静态宽高比,我可以像这样在约束中使用app:layout_constraintDimensionRatio="w,16:9"进行设置。

<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"  />

但是我从API获得的每个视频都有不同的宽高比,因此我想根据视频设置不同的宽高比。我无法在ConstraintSet

中找到以编程方式进行设置的方法

我尝试了一种变通方法来设置android:layout_height="wrap_content"并以编程方式更改视图纵横比。但是它不起作用,动画不能正常工作。

任何解决方案或建议将不胜感激。

1 个答案:

答案 0 :(得分:6)

您可以执行的操作是访问ConstraintSet,然后设置比率:

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
}