有时候viewpager的嵌套 弄得脑袋疼死,下面和大家分享 以下我项目中 处理的逻辑,
我选择的是:里面的viewPager使用的是自定义控件,
自定义viewpager,重写dispatchTouchEvent方法。
代码如下
public class TouchedViewPager extends ViewPager { private float mDownX; private float mDownY; public TouchedViewPager(Context context) { super(context); } public TouchedViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { // 请求父容器不要拦截touch // true:请求不拦截 // false:请求拦截 int currentItem = getCurrentItem(); switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: mDownX = ev.getX(); mDownY = ev.getY(); getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_MOVE: float moveX = ev.getX(); float moveY = ev.getY(); if (Math.abs(moveX - mDownX) > Math.abs(moveY - mDownY)) { // 水平滑动 if (currentItem == (getAdapter().getCount() - 1) && mDownX >= moveX) { // 如果当前viewpager选中最后一个页面,从右往左滑动,滑动的是外部的Viewpager,外部的要拦截touch getParent().requestDisallowInterceptTouchEvent(false); } else if (currentItem == 0 && mDownX < moveX) { // 如果当前viewpager选中第一个页面,从左往右滑动,滑动的是外部的view(viewpager,SlidingMenu),让外部去拦截 getParent().requestDisallowInterceptTouchEvent(false); } else { // 3. 其他情况都是自己响应 getParent().requestDisallowInterceptTouchEvent(true); } } else { getParent().requestDisallowInterceptTouchEvent(false); } break; case MotionEvent.ACTION_UP: break; default: break; } return super.dispatchTouchEvent(ev); } }
这样 当viewpager滑动的时候,就不会出现 滑动冲突的问题了。
最好的学习,就是分享,