在内部视图的 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