android ViewPager嵌套使用的滑动冲突解决方案,优先让里层的ViewPager滑动完毕后外层的ViewPager再滑动


很多时候,因为开发需要,往往需要进行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);
    }
}

又测试了一把,没有太大问题,打完收工。。。。。。



希望对大家有帮助吧!



你可能感兴趣的:(android)