From 49eca55cd724c37c78e1e53651336884bfa44e99 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sun, 22 Aug 2021 09:04:54 -0600 Subject: [PATCH] home: reduce viewpager sensitivity By default, ViewPager2's sensitivity can result in vertical scroll actions being registered as horizontal scroll actions, which is bad for UX. Fix that by reflecting into the internal RecyclerView and changing the touch slope value. --- .../org/oxycblt/auxio/home/HomeFragment.kt | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt index 53f022efd..bb57387c0 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt @@ -78,7 +78,32 @@ class HomeFragment : Fragment() { true } - binding.homePager.adapter = HomePagerAdapter() + binding.homePager.apply { + adapter = HomePagerAdapter() + + // By default, ViewPager2's sensitivity is high enough to result in vertical + // scroll events being registered as horizontal scroll events. Reflect into the + // internal recyclerview and change the touch slope so that touch actions will + // act more as a scroll than as a swipe. + // Derived from: https://al-e-shevelev.medium.com/how-to-reduce-scroll-sensitivity-of-viewpager2-widget-87797ad02414 + + try { + val recycler = ViewPager2::class.java.getDeclaredField("mRecyclerView").apply { + isAccessible = true + get(binding.homePager) + } + + RecyclerView::class.java.getDeclaredField("mTouchSlop").apply { + isAccessible = true + + val slop = get(recycler) as Int + set(recycler, slop * 8) + } + } catch (e: Exception) { + logE("Unable to reduce ViewPager sensitivity") + logE(e.stackTraceToString()) + } + } TabLayoutMediator(binding.homeTabs, binding.homePager) { tab, pos -> val labelRes = when (pos) {