簡體   English   中英

Viewpager2 僅水平滑動手勢 Android

[英]Viewpager2 swipe gesture only horizontally Android

如何防止 Viewpager2 上的對角滑動,僅在手勢嚴格水平時才允許滑動。

我不想要這個

我要這個

這如何使它工作

來自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)

我發現這篇很棒的文章深入解決了這個問題。 問題實際上出在作為新 viewpager2 主干的 recyclerview 上。

很多時候,即使在子 RecyclerView 上執行了水平手勢,父 RecyclerView 也會介入並攔截觸摸事件而不是子 RecyclerView,從而導致小的垂直滾動而不是水平滾動。 當滾動手勢不是完全水平時,實際上會發生這種情況。 它實際上是對角線,即使您可以看到手勢的垂直距離與其水平距離相比很小並且其意圖明顯是水平的

進一步,文章作者通過深入recyclerview代碼解釋了這種行為的原因

總而言之,問題在於當 RecyclerView 被配置為像通常那樣在單個方向上滾動時,它不會測試手勢的全局形狀是否更水平(abs(dx)> abs(dy))或垂直( abs(dy) > abs(dx)) 在決定攔截它之前,可能與在相反方向滾動的子視圖沖突。

這是文章鏈接 滾動到底部,您會找到解決方案。 我認為這個解決方案比修改觸摸斜率值以降低拖動靈敏度要好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM