【问题标题】:MotionLayout multiple TransitionsMotionLayout 多个过渡
【发布时间】:2020-02-02 19:32:35
【问题描述】:

首先,我使用的是 androidx.constraintlayout:constraintlayout:2.0.0-beta1,因为 beta2 在我们的应用程序中搞乱了很多布局。

我试图让 MotionLayout 在不同的情况下播放两种不同的过渡:

1) 当点击某个项目时,我想让它展开和折叠; 2)滚动时,想法是让另一个项目折叠和展开(类似于折叠工具栏)。

经过一番研究,我发现 MotionLayout 在其 layoutDescription 中不会接受多个 Transition 标签(它只会加载它可以找到的第一个标签)。所以,为了让我的实现工作,我这样做了:

在我的 MotionScene 中,我只有滚动的 Transition 元素,以及它的两个 ConstraintSet。我还为点击动画定义了必要的 ConstraintSets。

<Transition
    android:id="@+id/scroll_transition"
    app:constraintSetStart="@id/notifications_expanded"
    app:constraintSetEnd="@id/notifications_collapsed">

    <OnSwipe
        app:dragDirection="dragUp"
        app:touchAnchorId="@id/swiperefresh_layout"
        app:touchAnchorSide="top"
        app:moveWhenScrollAtTop="true"/>

</Transition>

<ConstraintSet android:id="@+id/notifications_expanded">
    <Constraint android:id="@id/notifications"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/header_info_container"
        app:layout_constraintEnd_toEndOf="parent"/>
</ConstraintSet>

<ConstraintSet android:id="@+id/notifications_collapsed">
    <Constraint android:id="@id/notifications"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="@id/header_info_container"
        app:layout_constraintEnd_toEndOf="parent"/>
</ConstraintSet>

<ConstraintSet android:id="@+id/header_collapsed">

    <Constraint android:id="@id/header_info_container"
        android:visibility="gone"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/header_layout"
        app:layout_constraintEnd_toEndOf="parent"/>

</ConstraintSet>

<ConstraintSet android:id="@+id/header_expanded">

    <Constraint android:id="@id/header_info_container"
        android:visibility="visible"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/header_layout"
        app:layout_constraintEnd_toEndOf="parent"/>

</ConstraintSet>

在我的布局的 xml 中,我设置了 layoutDescription;

<androidx.constraintlayout.motion.widget.MotionLayout
        android:id="@+id/motion_layout"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutDescription="@xml/transitions">

滚动转换按预期完美运行。为了让点击动画真正起作用,我手动调用它:

if (headerInfoContainer.getVisibility() == View.VISIBLE) {
    motionLayout.setTransition(R.id.header_expanded, R.id.header_collapsed);
    motionLayout.setTransitionDuration(300);
    motionLayout.transitionToEnd();
} else {
    motionLayout.setTransition(R.id.header_collapsed, R.id.header_expanded);
    motionLayout.setTransitionDuration(300);
    motionLayout.transitionToEnd();
}

但是,在 sn-p 之后,滚动停止工作。我怀疑它已被禁用,但我找不到如何将其恢复为以前的状态。缺乏文档也无济于事。

提前谢谢你!

【问题讨论】:

  • 你能添加整个布局 xml 以便我可以看到哪些视图在哪里吗?可以使用两个 MotionLayouts 来完成此操作

标签: android android-motionlayout


【解决方案1】:

我知道这是一个旧帖子,但我会尝试为可能有同样问题的其他人回答。 实际上,是的,您的 MotionScene 中可以有多个过渡,但它们一次只能工作一个。 我可能不完全理解你需要什么,但如果你想要在你的标题中的其他视图,在你的标题折叠/展开时动画,你需要在你的 ConstraintSet 中设置他们的 Constraint 属性。 请记住,ConstraintSet 就像您的视图的一种状态,它从一种状态变为另一种状态,因此对于需要在特定集合上更改的每个视图,您需要使用 ConstraintSet 设置新视图的属性。 比如:

   <Transition
    android:id="@+id/scroll_transition"
    app:constraintSetStart="@id/notifications_expanded"
    app:constraintSetEnd="@id/notifications_collapsed">

    <OnSwipe
        app:dragDirection="dragUp"
        app:touchAnchorId="@id/swiperefresh_layout"
        app:touchAnchorSide="top"
        app:moveWhenScrollAtTop="true"/>

</Transition>

<ConstraintSet android:id="@+id/notifications_expanded">
    ... How your views should change from default layout when getting on this state
</ConstraintSet>

<ConstraintSet android:id="@+id/notifications_collapsed">
    ... How your views should change from default layout when getting on this state
</ConstraintSet>

在您的&lt;Transition&gt; 标签上,您告诉 MotionScene 的开始和结束状态是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2019-09-01
    • 2020-09-08
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多