gpt4 book ai didi

android - MotionLayout 多个 Transitions

转载 作者:行者123 更新时间:2023-12-04 04:24:11 24 4
gpt4 key购买 nike

首先,我使用的是 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();
}

但是,在该 fragment 之后,滚动停止工作。我怀疑它已被禁用,但我找不到如何将其恢复原状。缺乏文档也于事无补。

提前致谢!

最佳答案

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

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

在您的 <Transition> 上标记您告诉 MotionScene 什么是开始和结束状态。

关于android - MotionLayout 多个 Transitions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58236774/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com