很多时候,因为开发需要,往往需要进行ViewPager的嵌套进行使用,是的里层的ViewPager显示后优先滑动,然后再外层的viewPager滑动,解决思路:
1、判读里层的是不是ViewPager,如果是判断是Viewpager的第几个,如果是第1个并且是往左边滑动或者是最后一个并且是往右滑动就外层的ViewPager滑动
否则就里层的ViewPager滑动:
上代码、、、、、、所以可以对外层的ViewPager进行子View的判断:重写ViewPager
import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; public class MuiltViewPager extends ViewPager { public MuiltViewPager(Context context) { this(context, null); } public MuiltViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.e("dong", "onInterceptTouchEvent"); return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent ev) { Log.e("dong", "onTouchEvent"); return super.onTouchEvent(ev); } @Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { if (v != this && v instanceof ViewPager) { //判断当前的View是不是ViewPager Log.e("view_pager", "canScroll: ------------------1 "+dx ); int currentItem = ((ViewPager) v).getCurrentItem(); //当前的条目 int countItem = ((ViewPager) v).getAdapter().getCount(); //总的条目 Log.e("view_pager", "canScroll: ------------------1 "+dx ); if ((currentItem == (countItem - 1) && dx < 0) || (currentItem == 0 && dx > 0)) { //判断当前条目以及滑动方向 Log.e("dong", "canScroll perform"); Log.e("view_pager", "canScroll: ------------------2 "+dx ); return false; } return true; } Log.e("view_pager", "canScroll: ------------------3 "+dx ); return super.canScroll(v, checkV, dx, x, y); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.e("dong", "dispatchTouchEvent"); return super.dispatchTouchEvent(ev); } }
试了一把,没有太大的问题,,,,功能也算部分完成。。。。。外层的ViewPager使用重写的ViewPager,里层的就可使用正常的Viewpager;
方法二:重写里层的ViewPager,外层的ViewPager采用正常的ViewPager
import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; /** * 这个使用的时候放置在里层,外层使用正常的ViewPager, * */ public class MuiltsViewPager extends ViewPager { private int downX; private int downY; public MuiltsViewPager(Context context) { super(context); } public MuiltsViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: getParent().requestDisallowInterceptTouchEvent(true); downX = (int) ev.getX(); downY = (int) ev.getY(); break; case MotionEvent.ACTION_MOVE: int moveX = (int) ev.getX(); int moveY = (int) ev.getY(); int diffX = downX - moveX; int diffY = downY - moveY; if (Math.abs(diffX) > Math.abs(diffY)) { // 当前是横向滑动 if (getCurrentItem() == 0 && diffX < 0) { // 当前页面等于第一个页面, 并且是从左向右滑动, 可以拦截 getParent().requestDisallowInterceptTouchEvent(false); } else if (getCurrentItem() == (getAdapter().getCount() - 1) && diffX > 0) { // 当前页面等于最后一个, 并且是从右向左滑动, 可以拦截 getParent().requestDisallowInterceptTouchEvent(false); } else { // 自己处理 getParent().requestDisallowInterceptTouchEvent(true); } } else { // 竖着滑动, 可以拦截 getParent().requestDisallowInterceptTouchEvent(false); } break; default: break; } return super.dispatchTouchEvent(ev); } }
又测试了一把,没有太大问题,打完收工。。。。。。
希望对大家有帮助吧!