在内部视图的 onTouch 时防止滑动 ViewPager2
Prevent Swiping of ViewPager2 when onTouch of inner view
我有一个 ViewPager2,里面有一个片段,
在片段中,我有一个自定义视图,其中包含涉及移动手指的特定触摸逻辑。
如何在内部视图拦截触摸事件时防止ViewPager滑动?
override fun onTouchEvent(event: MotionEvent?): Boolean {
if (event?.action == MotionEvent.ACTION_DOWN || event?.action == MotionEvent.ACTION_MOVE) {
//Do some stuff here
}
return true
}
滑动此视图时,视图寻呼机仍会滑动到其他页面。
为内部视图设置OnTouchListener。在onTouch()
方法中,调用:
viewPager.requestDisallowInterceptTouchEvent(true)
ViewPager 在 onInterceptTouchEvent()
中处理其滑动动作。上面的代码阻止 ViewPager 调用 onInterceptTouchEvent()
。当您滑动时,ViewPager returns 在 onInterceptTouchEvent()
中为真,这也可以防止将触摸事件传递给子视图。因此,禁止拦截允许子视图处理触摸事件。
内部视图未被触摸时设置回false
。
根据我的经验,onInterceptTouchEvent()
阻止了 onTouchEvent()
。它不会阻止 OnTouchListener
。所以这里的关键是设置内视图OnTouchListener
要解决此问题,您应该像这样扩展 ViewPager2:
fun ViewPager2.reduceDragSensitivity() {
val recyclerViewField = ViewPager2::class.java.getDeclaredField("mRecyclerView")
recyclerViewField.isAccessible = true
val recyclerView = recyclerViewField.get(this) as RecyclerView
val touchSlopField = RecyclerView::class.java.getDeclaredField("mTouchSlop")
touchSlopField.isAccessible = true
val touchSlop = touchSlopField.get(recyclerView) as Int
touchSlopField.set(recyclerView, touchSlop * 6) // "6" was obtained experimentally
}
并调用 reduceDragSensitivity。所以 viewpager2 看起来像这样:
view_pager.reduceDragSensitivity()
示例:
https://github.com/ali-sardari/ViewPager2Example
我有一个 ViewPager2,里面有一个片段,
在片段中,我有一个自定义视图,其中包含涉及移动手指的特定触摸逻辑。
如何在内部视图拦截触摸事件时防止ViewPager滑动?
override fun onTouchEvent(event: MotionEvent?): Boolean {
if (event?.action == MotionEvent.ACTION_DOWN || event?.action == MotionEvent.ACTION_MOVE) {
//Do some stuff here
}
return true
}
滑动此视图时,视图寻呼机仍会滑动到其他页面。
为内部视图设置OnTouchListener。在onTouch()
方法中,调用:
viewPager.requestDisallowInterceptTouchEvent(true)
ViewPager 在 onInterceptTouchEvent()
中处理其滑动动作。上面的代码阻止 ViewPager 调用 onInterceptTouchEvent()
。当您滑动时,ViewPager returns 在 onInterceptTouchEvent()
中为真,这也可以防止将触摸事件传递给子视图。因此,禁止拦截允许子视图处理触摸事件。
内部视图未被触摸时设置回false
。
根据我的经验,onInterceptTouchEvent()
阻止了 onTouchEvent()
。它不会阻止 OnTouchListener
。所以这里的关键是设置内视图OnTouchListener
要解决此问题,您应该像这样扩展 ViewPager2:
fun ViewPager2.reduceDragSensitivity() {
val recyclerViewField = ViewPager2::class.java.getDeclaredField("mRecyclerView")
recyclerViewField.isAccessible = true
val recyclerView = recyclerViewField.get(this) as RecyclerView
val touchSlopField = RecyclerView::class.java.getDeclaredField("mTouchSlop")
touchSlopField.isAccessible = true
val touchSlop = touchSlopField.get(recyclerView) as Int
touchSlopField.set(recyclerView, touchSlop * 6) // "6" was obtained experimentally
}
并调用 reduceDragSensitivity。所以 viewpager2 看起来像这样:
view_pager.reduceDragSensitivity()
示例: https://github.com/ali-sardari/ViewPager2Example