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*3)
}
3条答案
按热度按时间fnvucqvd1#
这就是它的工作原理
来源于Medium
此外,你必须有这样的Recyclerview
也
yzckvree2#
我发现了这篇很棒的文章,深入地解决了这个问题。问题实际上出在RecyclerView上,它是新ViewPager2的支柱。
很多时候,即使对子RecyclerView执行水平手势,父RecyclerView也会介入并拦截触摸事件,而不是子RecyclerView,从而导致小的垂直滚动而不是水平滚动。实际上,当滚动手势不是完全水平时,就会发生这种情况。实际上,滚动手势是对角的。即使您可以看到手势的垂直距离与其水平距离相比很小并且其意图明显是水平的
此外,本文作者通过深入研究recyclerview代码解释了这种行为的原因
总而言之,问题在于当RecyclerView被配置为单向滚动时(这是常见的情况),在决定拦截手势之前,它不会测试手势的全局形状是更水平(abs(dx)〉abs(dy))还是更垂直(abs(dy)〉abs(dx)),这可能会与子视图反向滚动冲突。
这里是文章link,滚动到底部,你会找到解决方案,我认为这个解决方案比修改触摸斜率值来降低拖动敏感度要好。
jexiocij3#
经过几个小时的挣扎与viewpager2,我意识到最简单的方法是回到viewpager