11

我有一个用例,我想使用 MotionLayout 创建类似 Youtube 的动画。repo中有此动画的示例。但问题是,在这个例子中,他们使用静态高度来启动约束,如下所示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"编程方式设置和更改视图纵横比。但它不起作用,动画也不能正常工作。

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

4

1 回答 1

12

您可以做的是访问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
}
于 2019-02-26T11:17:41.253 回答