如何在 Android 中禁用 ViewPager 对角滑动滚动?

问题描述 投票:0回答:2

Sketch that tries to explain what I mean

我有一个带有

Activity
ViewPager
,其中包含多个页面,每个页面都包含一个
RecyclerView
。水平和垂直滑动按预期工作:水平更改页面,垂直滚动
RecyclerView

当用户进行对角滑动时,页面会发生变化。

如何防止这种情况发生?对角滑动只能滚动

RecyclerView

<?xml version="1.0" encoding="utf-8"?>
<androidx.viewpager2.widget.ViewPager2
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/page"
   android:layout_width="match_parent"
   android:layout_height="match_parent" />

我已经尝试过这个:

binding.page.setOnTouchListener(object : View.OnTouchListener {
   override fun onTouch(v: View?, event: MotionEvent?): Boolean {
      when (event?.action) {
         MotionEvent.ACTION_DOWN -> binding.page.isUserInputEnabled = false
      }
      return v?.onTouchEvent(event) ?: true
   }
})
android kotlin android-viewpager
2个回答
0
投票

我刚刚测试了你所描述的行为。在我看来,

ViewPager2
RecyclerView
可以完美地协同工作: 小于 45° 的对角线滑动时,
ViewPager2
会滚动。 对角滑动超过 45° 时,
RecyclerView
会滚动。

但是,这似乎仅在新创建

Activity
时才成立。它似乎也有点依赖于之前的滚动手势。

  • 当您第一次垂直滑动时(
    RecyclerView
    滚动),之后再次对角滚动将滚动
    RecyclerView
  • 当您刚刚进行水平滑动(
    ViewPager2
    滚动)时,对角滚动往往会滚动
    ViewPager2

也许这是预期的行为。为了提供更直观的用户体验,
我可能会保持原样,因为我必须测试相当长的时间才能重现您所描述的行为。
事实上,所有的滚动感觉都非常直观。

请记住:如果您真的只想允许 0° 水平滑动来滚动

ViewPager2
,那么您会给用户带来非常困难的时间。 实际上不可能滚动
ViewPager2


0
投票

我和你有同样的问题,但就我而言,我的 ViewPage 片段中有一个 webView,我测试滚动是否更垂直然后水平,如果滚动是水平的,则禁用 ViewPager 的用户交互。

但是你看,这个gestureDetector被应用到了我的WebView上。

像这样

val gestureDetector =
        GestureDetector(
            context,
            object : GestureDetector.SimpleOnGestureListener() {
                var initialValue = true

                override fun onDown(e: MotionEvent): Boolean {
                    magazineViewActivity.mViewPagerMagazine?.isUserInputEnabled = true
                    initialValue = true
                    return super.onDown(e)
                }

                override fun onScroll(
                    e1: MotionEvent?,
                    e2: MotionEvent,
                    distanceX: Float,
                    distanceY: Float
                ): Boolean {
                    if(initialValue && Math.abs(distanceY) > Math.abs(distanceX)){
                        magazineViewActivity.mViewPagerMagazine?.isUserInputEnabled = false
                    }
                    initialValue = false

                    return super.onScroll(e1, e2, distanceX, distanceY)
                }
            },
        )
© www.soinside.com 2019 - 2024. All rights reserved.