是否可以在 MotionLayout 中有两个滑动处理程序?

Is it possible to have two swipe handlers in a MotionLayout?

我想从 Google Play 商店(或许多其他 google 应用程序)重新创建一个菜单(参见下面的屏幕截图),但我不知道如何操作。 Screenshot of the menu

我尝试将 MotionLayout 与两个垂直滑动处理程序(一个带 dragUp,另一个带 dragDown)一起使用,以在 DialogFragment 上播放两种不同的过渡,但它不起作用...

我的fragment_dialog_scene.xml.

<?xml version="1.0" encoding="utf-8"?>
<MotionScene 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto">

    <Transition
        motion:constraintSetStart="@+id/start"
        motion:constraintSetEnd="@+id/end" >
        <OnSwipe
            motion:touchAnchorId="@+id/frameLayout2"
            motion:dragDirection="dragUp"
            motion:touchAnchorSide="top" />
    </Transition>

    <ConstraintSet android:id="@+id/start">
        <Constraint
            android:id="@+id/frameLayout2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="78dp"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp">
            <CustomAttribute
                motion:attributeName="radius"
                motion:customPixelDimension="2.5dp" />
        </Constraint>
    </ConstraintSet>

    <ConstraintSet android:id="@+id/end">
        <Constraint
            android:id="@+id/frameLayout2"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <CustomAttribute
                motion:attributeName="radius"
                motion:customPixelDimension="0dp" />
        </Constraint>
    </ConstraintSet>

    <ConstraintSet
        android:id="@+id/dismiss"
        motion:deriveConstraintsFrom="@+id/start" >
        <Constraint
            android:id="@+id/frameLayout2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginEnd="16dp"
            android:layout_marginStart="16dp"
            android:layout_marginTop="350dp" />
    </ConstraintSet>

    <Transition
        motion:constraintSetStart="@+id/start"
        motion:constraintSetEnd="@+id/dismiss" >
        <OnSwipe
            motion:touchAnchorId="@+id/frameLayout2"
            motion:dragDirection="dragUp"
            motion:touchAnchorSide="top" />
        <OnClick />
    </Transition>
</MotionScene>

我的fragment_dialog.xml.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/motion_layout"
    app:layoutDescription="@xml/fragment_dialog_scene">

    <View
        android:id="@+id/background_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/black"/>

    <androidx.cardview.widget.CardView
        android:id="@+id/frameLayout2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginHorizontal="16dp"
        app:cardCornerRadius="8dp">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/nested_scroll"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center_horizontal"/>

    </androidx.cardview.widget.CardView>

</androidx.constraintlayout.motion.widget.MotionLayout>

PS: 我不会写评论,我没有足够的声誉,但是如果我需要添加一些东西,你可以让我编辑post。

转换在状态(ConstraintSets - 代表整个 MotionLayout ViewGroup)之间运行。 你可以有 3 个状态,比如 A、B 和 C,还有两个转换,比如 t1 和 t2 这样 t1 是 B 到 A 的转换 t2 是 B 到 C 的转换。 两者都有一个向上滑动另一个向下滑动 ( A <-t1- B -t2-> C)

然后在 B 中时,您将能够滑动到 A 或 C。

常见的错误是将它们视为动作。 t1开X t2开Y,为什么我不能开X开Y? 问题是描述了 4 个状态关闭,x 打开,y 打开和,x & y 打开。 然后,如果您需要在所有 4 个状态之间进行更多转换。

最新的 android 计算器就是一个很好的例子,它有 9 个状态。