public class ChildViewPager extends ViewPager { /** 触摸时按下的点 **/ PointF downP = new PointF(); /** 触摸时当前的点 **/ PointF curP = new PointF(); OnSingleTouchListener onSingleTouchListener; public ChildViewPager(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public ChildViewPager(Context context) { super(context); // TODO Auto-generated constructor stub } @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { // TODO Auto-generated method stub // 当拦截触摸事件到达此位置的时候,返回true, // 说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent return true; } @Override public boolean onTouchEvent(MotionEvent arg0) { // TODO Auto-generated method stub // 每次进行onTouch事件都记录当前的按下的坐标 float offX, offY; curP.x = arg0.getX(); curP.y = arg0.getY(); if (arg0.getAction() == MotionEvent.ACTION_DOWN) { // 记录按下时候的坐标 // 切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变 downP.x = arg0.getX(); downP.y = arg0.getY(); // 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰 getParent().requestDisallowInterceptTouchEvent(true); } if (arg0.getAction() == MotionEvent.ACTION_MOVE) { // 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰 // 判断是左右滑还是上下滑,如果左右滑动-》通知父类不对自己进行干扰,如果上下滑动进行干扰 offX = arg0.getX() - downP.x; offY = arg0.getY() - downP.y; if (Math.abs(offX) > Math.abs(offY)) {// 横向滑动,不对事件进行拦截。 // 判断此时是否是最后一页如果是最后一页也通知父类对事件拦截 if (getCurrentItem() == 0) {// 左边或右边,这样就必须设置总共的view的个数 // 在最左边能从左往右滑动 if (offX > 0) {// 从左往右 getParent().requestDisallowInterceptTouchEvent(false); } } else if (getChildCount() == (getCurrentItem() + 1)) { // 在最右边能从右往左滑动 if (offX < 0) {// 从左往右 getParent().requestDisallowInterceptTouchEvent(false); } } else { getParent().requestDisallowInterceptTouchEvent(true); } System.out.println("set true" + getCurrentItem() + "-" + getChildCount() + ""); } else { getParent().requestDisallowInterceptTouchEvent(false); } } if (arg0.getAction() == MotionEvent.ACTION_UP) { // 在up时判断是否按下和松手的坐标为一个点 // 如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick if (downP.x == curP.x && downP.y == curP.y) { onSingleTouch(); return true; } } return super.onTouchEvent(arg0); } /** * 单击 */ public void onSingleTouch() { if (onSingleTouchListener != null) { onSingleTouchListener.onSingleTouch(); } } /** * 创建点击事件接口 * * @author wanpg * */ public interface OnSingleTouchListener { public void onSingleTouch(); } public void setOnSingleTouchListener( OnSingleTouchListener onSingleTouchListener) { this.onSingleTouchListener = onSingleTouchListener; }
原来的ChildViewPager是从网上找的,他只解决里层viewpager不被外层viewpager拦截的作用。但在项目中还需要的是滑动到一端继续滑动就要滑动外层的viewpager,此时就要取得viewpager的子view的个数,并判断如果是最右端就内层响应从左向右的手势,把从右向左的手势推给外层,最左端反之。
getChildCount()也可以在viewpager替换成子view的个数,也可以在外面设定:viewPager.setOffscreenPageLimit(4);