13

在 RecyclerView 中使用 MotionLayouts 时,我注意到 MotionLayouts 不会动画环绕他们的孩子,如果这些发生在高度上。

重现该行为的一种简单方法是使用以下布局:

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

以及与 OnClick 触发器关联的 MotionScene :

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

这将给出以下结果:

行为示范

如您所见,MotionLayout 的高度在过渡开始后立即设置为最终的预期高度,使其蓝色背景可见,直到子视图完成自己的高度过渡并完全重叠为止。

如果您尝试实现扩展项动画,则在 RecyclerView 中也会发生同样的事情。

有没有办法让 MotionLayout 在过渡期间完全适合它的孩子的高度,或者这会不会太划算?

4

1 回答 1

1

避免调整 MotionLayout 的边界。相反,让它更大,并且只为你的子对象的大小设置动画。您可以使空白区域透明并将触摸事件传递给底层视图。

来源和示例: https ://medium.com/vrt-digital-studio/picture-in-picture-video-overlay-with-motionlayout-a9404663b9e7

于 2018-10-02T14:59:34.853 回答