android - MotionLayout - OnSwipe 不适用于可点击的子项
问题描述
我遇到了一个问题MotionLayout
,如果用户在可点击的项目上开始滑动,他们就无法向上/向下滑动。我希望用户能够在屏幕的任何部分上滑动,并触发滑动过渡。
基本上,该行为将与目前在 Android 的 Yelp 应用程序上的行为非常相似。在屏幕上的任意位置向上滑动会将搜索栏移动到屏幕顶部。请参阅此滑动行为视频。
我的过渡代码如下所示:
<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>
以下是我尝试过但无法开始工作的所有事情:
onInterceptTouchEvent
在可点击视图的父级中覆盖ViewGroup
(仅在此处返回 true 将导致我想要的滑动行为,但是应该可点击的子视图不再是。)
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
if (ev?.action == MotionEvent.ACTION_DOWN) {
onTouchEvent(ev)
return false
}
return true
}
onTouchEvent
在可点击的子视图中覆盖
override fun onTouchEvent(event: MotionEvent?): Boolean {
if (event?.action == MotionEvent.ACTION_DOWN) {
super.onTouchEvent(event)
return false
}
return super.onTouchEvent(event)
}
- 覆盖
onInterceptTouchEvent
在MotionLayout
override fun onInterceptTouchEvent(event: MotionEvent?): Boolean {
if (event?.action == MotionEvent.ACTION_MOVE) {
return super.onInterceptTouchEvent(event)
}
return false
}
我查看了所有这些 StackOverflow 帖子(还有更多,但这些是最相关的):
- 儿童拦截触摸事件的 MotionLayout 问题
- 我们可以在 Android MotionLayout 的同一过渡中使用 OnSwipe 和 OnClick 吗?
- 如何在类似于 YouTube 的 MotionLayout 中处理 OnClick 和 OnClickListener
- MotionLayout OnSwipe 和 OnClick 在同一个视图上
- MotionLayout 阻止所有视图上的单击侦听器
- MotionLayout - 如何将 OnSwipe 事件限制在特定视图而不是整个屏幕上
关于我可以在这里做些什么来滑动和点击项目有什么想法吗?
解决方案
我让它工作了。这里有两件事有帮助:
- 我将 GridView 切换为带有 GridLayoutManager 的 RecyclerView 并设置
app:touchAnchorId
为 RecyclerView 的 id。 - 我实际上在 MotionScene 文件中有两个过渡,另一个过渡(不是 OnSwipe)是第一个。MotionScene 文件中的顺序很重要。我切换了两个转换的顺序,然后我让它工作了。但是,一旦触发了另一个转换,它将停止工作,因此我不得不
setTransition
在适当的时候将转换重置回 OnSwipe 转换。
我希望能帮助遇到这个问题的人。
推荐阅读
- python - 在 Mac 上安装 python 2.6
- d - 如何声明一组红黑树?
- python - FB Auto Group 海报与 Python 中的 Selenium
- android - Admob 插页式广告,onBackPressed 不会关闭广告
- mongodb - 如果未压缩的数据大小大于缓存大小,MongoDB 总是会出现校验和错误
- python - 将 2d 列表与列表理解而不是 for 循环连接
- html - flexbox div 中的绝对 div 表现得像固定的
- mockito - 我可以在 mockito 参数中混合一个匹配器和 1 个精确值吗
- jestjs - @quasar/extras/mdi-v4 开玩笑的单元测试在意外令牌“导出”上失败
- stored-procedures - EF CORE 调用 Oracle11g 的输出参数上的“数字或值错误”