【问题标题】:Prevent Swiping of ViewPager2 when onTouch of inner view防止内视图onTouch时滑动ViewPager2
【发布时间】:2020-06-05 07:11:03
【问题描述】:

我有一个 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
}

在滑动此视图时,视图寻呼机仍会滑动到其他页面。

【问题讨论】:

    标签: android android-viewpager ontouch android-viewpager2


    【解决方案1】:

    为内部视图设置 OnTouchListener。在onTouch()方法中,调用:

    viewPager.requestDisallowInterceptTouchEvent(true)
    

    ViewPager 在onInterceptTouchEvent() 中处理其滑动动作。上面的代码阻止 ViewPager 调用onInterceptTouchEvent()。当您滑动时,ViewPager 在onInterceptTouchEvent() 中返回 true,这也阻止了将触摸事件传递给子视图。因此禁止拦截允许子视图处理触摸事件。

    当内部视图未被触摸时,设置回false

    根据我的经验,onInterceptTouchEvent() 阻止了onTouchEvent()。它不会阻止OnTouchListener。所以这里的关键是为内部视图设置OnTouchListener

    【讨论】:

    • 尝试使用此解决方案来停止自动滑动计时器,它可以工作。
    【解决方案2】:

    要解决这个问题,您应该像这样扩展 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      相关资源
      最近更新 更多