我有一个带有
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
}
})
我刚刚测试了你所描述的行为。在我看来,
ViewPager2
和 RecyclerView
可以完美地协同工作:
小于 45° 的对角线滑动时,ViewPager2
会滚动。
对角滑动超过 45° 时,RecyclerView
会滚动。
但是,这似乎仅在新创建
Activity
时才成立。它似乎也有点依赖于之前的滚动手势。
RecyclerView
滚动),之后再次对角滚动将滚动RecyclerView
。ViewPager2
滚动)时,对角滚动往往会滚动 ViewPager2
。也许这是预期的行为。为了提供更直观的用户体验,
我可能会保持原样,因为我必须测试相当长的时间才能重现您所描述的行为。
事实上,所有的滚动感觉都非常直观。
请记住:如果您真的只想允许 0° 水平滑动来滚动
ViewPager2
,那么您会给用户带来非常困难的时间。
实际上不可能滚动 ViewPager2
。
我和你有同样的问题,但就我而言,我的 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)
}
},
)