今天在做一个商城app的时候,顶部使用的是ViewPager进行轮播图显示的,外部集成的是SlidingMenu和ViewPager,当内部的第一个ViewPager向左滑动的时候,直接打开了左侧菜单而不能实现图片的切换,这个时候就要自定义ViewPager,重写dispatchTouchEvent方法,请求父视图不要拦截事件。但是这样做又带来了一个新的问题,当反拦截以后,外部的SlidingMenu和ViewPager将不再响应事件。所以反拦截是有条件的。一.竖直方向滑动,不做处理 设置是否拦截事件为 getParent().requestDisallowInterceptTouchEvent(false);
二.水平方向滑动1.当滑动到第一个页面,并且方向是从左到右的滑动 endX - startX > 0 那么方向就是:从左往右滑动 getParent().requestDisallowInterceptTouchEvent(false);
2.当滑动到最后一个页面的时候,并且方向是从右到左滑动endX - startX < 0 那么方向就是:从右往左滑动 getParent().requestDisallowInterceptTouchEvent(false);
3.其他情况getParent().requestDisallowInterceptTouchEvent(true);具体代码如下
private float lastX; private float lastY; @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: // down的时候要先把事件传到最里面 然后根据情况是否是父亲拦截 getParent().requestDisallowInterceptTouchEvent(true); lastX = ev.getRawX(); lastY = ev.getRawY(); break; case MotionEvent.ACTION_MOVE: float dx = ev.getRawX() - lastX; float dy = ev.getRawY() - lastY; //判断是水平滑动还是垂直滑动 if (Math.abs(dx) > Math.abs(dy)) { //水平滑动 if (getCurrentItem() == 0 && dx > 0) { //从左向右滑 不请求 getParent().requestDisallowInterceptTouchEvent(false); } else if (getCurrentItem() == getAdapter().getCount() - 1 && dx < 0) { getParent().requestDisallowInterceptTouchEvent(false); } else { getParent().requestDisallowInterceptTouchEvent(true); } } else { //垂直滑动 不请求 getParent().requestDisallowInterceptTouchEvent(false); } break; case MotionEvent.ACTION_UP: break; } return super.dispatchTouchEvent(ev); }这样顶部ViewPager及外面的SlidingMenu和ViewPager切换就正常了。