Android Kotlin ViewPager2 Fragment 触摸冲突解决:使用 GestureDetector 处理事件
在 Fragment 中使用 setOnTouchListener 与 Viewpager2 左右拖动冲突的解决办法是使用 GestureDetector 来处理触摸事件。下面是具体的代码示例:
首先,在 Fragment 中定义一个 GestureDetector 对象:
private lateinit var gestureDetector: GestureDetector
然后,在 Fragment 的 onCreateView 方法中初始化 GestureDetector 对象,并将触摸事件交给 GestureDetector 处理:
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val rootView = inflater.inflate(R.layout.fragment_my, container, false)
// 初始化GestureDetector对象
gestureDetector = GestureDetector(requireContext(), object : GestureDetector.SimpleOnGestureListener() {
override fun onDown(e: MotionEvent?): Boolean {
// 返回true表示消费了该事件
return true
}
})
// 设置触摸事件监听器
rootView.setOnTouchListener { v, event ->
// 将触摸事件交给GestureDetector处理
gestureDetector.onTouchEvent(event)
}
return rootView
}
接下来,重写 Fragment 的 onCreate 方法,在其中设置 ViewPager2 的触摸事件监听器,通过判断是否滑动到边界来解决冲突:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 设置ViewPager2的触摸事件监听器
viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
// 判断是否滑动到边界
if (position == 0 && positionOffsetPixels == 0) {
// 左边界,禁止向右滑动
viewPager2.isUserInputEnabled = false
} else if (position == viewPager2.adapter?.itemCount?.minus(1) && positionOffsetPixels == 0) {
// 右边界,禁止向左滑动
viewPager2.isUserInputEnabled = false
} else {
// 非边界,允许滑动
viewPager2.isUserInputEnabled = true
}
}
})
}
这样就可以在 Fragment 中使用 setOnTouchListener 与 Viewpager2 左右拖动冲突的情况下,通过使用 GestureDetector 来处理触摸事件,并通过判断是否滑动到边界来解决冲突。
原文地址: https://www.cveoy.top/t/topic/mqVF 著作权归作者所有。请勿转载和采集!