Viewpager2仅水平滑动手势Android

smtd7mpg  于 2023-02-27  发布在  Android
关注(0)|答案(3)|浏览(205)

如何防止在Viewpager2上对角滑动,仅当手势严格水平时才允许滑动。
I dot not want this
I want this

fnvucqvd

fnvucqvd1#

这就是它的工作原理
来源于Medium

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)
}

此外,你必须有这样的Recyclerview

<androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layerType="hardware"
        android:orientation="vertical"
        android:overScrollMode="never"
        android:scrollbars="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerArtist"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center_horizontal"
            android:clipToPadding="false"
            android:layerType="hardware"
            android:orientation="vertical"
            android:overScrollMode="never" />

    </androidx.core.widget.NestedScrollView>

ViewCompat.setNestedScrollingEnabled(recyclerView,false)
yzckvree

yzckvree2#

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

jexiocij

jexiocij3#

经过几个小时的挣扎与viewpager2,我意识到最简单的方法是回到viewpager

相关问题