概述
今天在项目中遇到一个比较磨人的需求,涉及到了ViewPager嵌套ViewPager的滑动问题,写一篇博客来记录下有关于ViewPager嵌套使用的一些坑,以及View的事件的再次学习。
场景描述
首先看一下项目中的需求,大致效果图如下:
以上是UI图,最上方的3个tab需要可以滑动,而每个tab都对应着常规、个性、特定、豪华四个tab。我的实现思路是用两个ViewPager,最外层是一个ViewPager,对应3个tab,ViewPager的内部又是一个ViewPager,对应下面4个tab。
很显然,两个ViewPager的滑动会引发滑动冲突,因此下面就来解决一下滑动冲突所引起的问题。
手动处理滑动问题
关于滑动冲突问题,我是通过重写onTouchEvent(MotionEvent arg0)
来实现的。
思路大致如下:
- 首先内部的ViewPager滑动只有在第一页向左滑动或者最后一页向右滑动的时候会出现问题。
- 记录下手指按下的点点坐标,然后在滑动的时候获取到手指的位置坐标,然后通过两者在X的坐标相减就可以知道此次操作是向左还是向右滑动,从而来判断父控件是否需要拦截事件。
- 内部的ViewPager的第一页向左滑动或者最后一页向右滑动的时候,父控件拦截事件。
以上就是大致的处理方法,那么直接来看代码:
|
|
上述代码中首先在MotionEvent.ACTION_DOWN
也就是手指按下的时候记录下按下的坐标位置,然后在MotionEvent.ACTION_MOVE
手指移动的时候再次纪录下位置坐标,接着进行判断此次滑动是上下滑动还是左右滑动Math.abs(curF.x - downF.x) > Math.abs(curF.y - downF.y)
当左右滑动的时候,第一页向左滑以及最后一页向右滑都需要拦截getParent().requestDisallowInterceptTouchEvent(false)
大致思路就是这样,以后有空的话还会再写一篇博客,来详细学习一下View的事件机制。
Tips
还有一个坑需要注意一下,就是内部的ViewPager在创建Adapter(FragmentAdapter)的时候需要调用getChildFragmentManager()
以上