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

Bur*_*hid 3 android android-layout android-constraintlayout android-motionlayout

我有一个用例,其中我想使用MotionLayout创建类似动画的Youtube。仓库中有此动画的样本。但是问题在于,在此示例中,他们将静态高度用于起始约束,如下所示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>
Run Code Online (Sandbox Code Playgroud)

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

<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"  />
Run Code Online (Sandbox Code Playgroud)

但是我从API获得的每个视频都有不同的宽高比,因此我想根据视频设置不同的宽高比。我无法找到一种方法以编程方式在ConstraintSet

我尝试了一种解决方法,以android:layout_height="wrap_content"编程方式设置和更改视图宽高比。但是它不起作用,动画不能正常工作。

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

jos*_*olf 7

您可以做的是访问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
}
Run Code Online (Sandbox Code Playgroud)

  • 对于那些寻求 constrainHeight (或宽度)的示例:``with(motionLayout) { getConstraintSet(R.id.start).constrainHeight(R.id.view_id, viewHeight) getConstraintSet(R.id.end).constrainHeight(R. id.view_id, viewHeight) }`` (3认同)