MotionLayout - OnSwipe 无法点击 children
MotionLayout - OnSwipe not working on clickable children
我 运行 遇到了使用 MotionLayout
的问题,如果用户在可点击的项目上开始滑动,则无法滑动 up/down。我希望用户能够在屏幕的任何部分滑动,并触发滑动转换。
基本上,该行为将与 Yelp 应用程序目前在 Android 上的行为非常相似。在屏幕上的任意位置向上滑动会将搜索栏移动到屏幕顶部。请参阅滑动行为的 video。
我的转换代码如下所示:
<Transition
app:constraintSetStart="@id/start"
app:constraintSetEnd="@id/end"
>
<OnSwipe
app:dragDirection="dragUp"
app:onTouchUp="decelerate"
/>
</Transition>
我的 MotionLayout
代码看起来像这样:
<androidx.constraintlayout.motion.widget.MotionLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutDescription="@xml/motion_scene">
>
<!-- other views -->
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/title"
android:textColor="@color/black"
android:textSize="14sp"
android:lineSpacingExtra="7sp"
android:fontFamily="@font/avenir"
android:layout_marginBottom="16dp"
/>
<GridView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numColumns="2"
android:verticalSpacing="8dp"
android:horizontalSpacing="12dp"
android:stretchMode="columnWidth"
tools:listitem="@layout/griditem" <!-- This layout file contains a single <Button/> -->
/>
</LinearLayout>
</androidx.constraintlayout.motion.widget.MotionLayout>
以下是我尝试过但无法正常工作的所有方法:
- 在可点击视图的
ViewGroup
parent 中覆盖 onInterceptTouchEvent
(只要在此处返回 true 将导致我想要的滑动行为,但 children应该可点击的视图不再是。)
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
if (ev?.action == MotionEvent.ACTION_DOWN) {
onTouchEvent(ev)
return false
}
return true
}
- 在可点击的 child 视图中覆盖
onTouchEvent
override fun onTouchEvent(event: MotionEvent?): Boolean {
if (event?.action == MotionEvent.ACTION_DOWN) {
super.onTouchEvent(event)
return false
}
return super.onTouchEvent(event)
}
- 覆盖
MotionLayout
中的 onInterceptTouchEvent
override fun onInterceptTouchEvent(event: MotionEvent?): Boolean {
if (event?.action == MotionEvent.ACTION_MOVE) {
return super.onInterceptTouchEvent(event)
}
return false
}
我查看了所有这些 Whosebug 帖子(还有更多,但这些是最相关的):
- MotionLayout problems with children intercepting touch events
- How to handle OnClick and OnClickListener in MotionLayout similar to YouTube
- MotionLayout OnSwipe and OnClick on same view
关于我可以在此处执行哪些操作以能够滑动和单击项目的任何想法?
我成功了。这里有两件事有帮助:
- 我将 GridView 切换为带有 GridLayoutManager 的 RecyclerView,并将
app:touchAnchorId
设置为 RecyclerView 的 ID。
- 我实际上在 MotionScene 文件中有两个转换,另一个转换(不是 OnSwipe)是第一个。 MotionScene 文件中的顺序很重要。 我调换了两个过渡的顺序,然后它开始工作了。然而,一旦另一个转换被触发,它就会停止工作,所以我不得不使用
setTransition
在适当的时候将转换重置回 OnSwipe 转换。
希望对遇到此问题的人有所帮助。
我 运行 遇到了使用 MotionLayout
的问题,如果用户在可点击的项目上开始滑动,则无法滑动 up/down。我希望用户能够在屏幕的任何部分滑动,并触发滑动转换。
基本上,该行为将与 Yelp 应用程序目前在 Android 上的行为非常相似。在屏幕上的任意位置向上滑动会将搜索栏移动到屏幕顶部。请参阅滑动行为的 video。
我的转换代码如下所示:
<Transition
app:constraintSetStart="@id/start"
app:constraintSetEnd="@id/end"
>
<OnSwipe
app:dragDirection="dragUp"
app:onTouchUp="decelerate"
/>
</Transition>
我的 MotionLayout
代码看起来像这样:
<androidx.constraintlayout.motion.widget.MotionLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutDescription="@xml/motion_scene">
>
<!-- other views -->
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/title"
android:textColor="@color/black"
android:textSize="14sp"
android:lineSpacingExtra="7sp"
android:fontFamily="@font/avenir"
android:layout_marginBottom="16dp"
/>
<GridView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numColumns="2"
android:verticalSpacing="8dp"
android:horizontalSpacing="12dp"
android:stretchMode="columnWidth"
tools:listitem="@layout/griditem" <!-- This layout file contains a single <Button/> -->
/>
</LinearLayout>
</androidx.constraintlayout.motion.widget.MotionLayout>
以下是我尝试过但无法正常工作的所有方法:
- 在可点击视图的
ViewGroup
parent 中覆盖onInterceptTouchEvent
(只要在此处返回 true 将导致我想要的滑动行为,但 children应该可点击的视图不再是。)
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
if (ev?.action == MotionEvent.ACTION_DOWN) {
onTouchEvent(ev)
return false
}
return true
}
- 在可点击的 child 视图中覆盖
onTouchEvent
override fun onTouchEvent(event: MotionEvent?): Boolean {
if (event?.action == MotionEvent.ACTION_DOWN) {
super.onTouchEvent(event)
return false
}
return super.onTouchEvent(event)
}
- 覆盖
MotionLayout
中的
onInterceptTouchEvent
override fun onInterceptTouchEvent(event: MotionEvent?): Boolean {
if (event?.action == MotionEvent.ACTION_MOVE) {
return super.onInterceptTouchEvent(event)
}
return false
}
我查看了所有这些 Whosebug 帖子(还有更多,但这些是最相关的):
- MotionLayout problems with children intercepting touch events
- How to handle OnClick and OnClickListener in MotionLayout similar to YouTube
- MotionLayout OnSwipe and OnClick on same view
关于我可以在此处执行哪些操作以能够滑动和单击项目的任何想法?
我成功了。这里有两件事有帮助:
- 我将 GridView 切换为带有 GridLayoutManager 的 RecyclerView,并将
app:touchAnchorId
设置为 RecyclerView 的 ID。 - 我实际上在 MotionScene 文件中有两个转换,另一个转换(不是 OnSwipe)是第一个。 MotionScene 文件中的顺序很重要。 我调换了两个过渡的顺序,然后它开始工作了。然而,一旦另一个转换被触发,它就会停止工作,所以我不得不使用
setTransition
在适当的时候将转换重置回 OnSwipe 转换。
希望对遇到此问题的人有所帮助。