[英]Viewpager2 swipe gesture only horizontally Android
這如何使它工作
來自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.