RecyclerView嵌套ViewPager冲突,viewpager上划无效

Recyclerview嵌套viewpager,手指按在viewpager上向上滑动无效(首页banner轮播)。
继承ViewPager重写onTouchEvent()方法,对viewpager进行分发处理。

首先获取手指触摸位置
判断viewpager的滑动方向,
if是上下滑动交给父布局处理
if左右滑动拦截下来自己处理

  PointF downP = new PointF();
    PointF curP = new PointF();
    private float xDown;// 记录手指按下时的横坐标。
    private float xMove;// 记录手指移动时的横坐标。
    private float yDown;// 记录手指按下时的纵坐标。


 @Override
    public boolean onTouchEvent(MotionEvent ev) {
        // 每次进行onTouch事件都记录当前的按下的坐标
        curP.x = ev.getX();
        curP.y = ev.getY();
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
          
            downP.x = ev.getX();
            downP.y = ev.getY();

            xDown = ev.getX();
            yDown = ev.getY();

            // 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
            getParent().requestDisallowInterceptTouchEvent(true);
        }

        //移动的时候进行判断
        if (ev.getAction() == MotionEvent.ACTION_MOVE) {

            xMove = ev.getX();
            float yMove = ev.getY();
            // 这里判断是横向还是纵向移动,
            if (Math.abs(yMove - yDown) < Math.abs(xMove - xDown) && Math.abs(xMove - xDown) > 2) {
                // 横向滑动的处理
                if (Math.abs(xMove - xDown) > 2) {
                    // 左右滑动的时候进行拦截,自己处理
                    getParent().requestDisallowInterceptTouchEvent(true);
                } else {
                    // 自己进行处理,不在上传给父布局
                    return false;
                }
            } else {
                // 父布局进行事件拦截
                getParent().requestDisallowInterceptTouchEvent(false);
            }
        }
        return super.onTouchEvent(ev);
    }

你可能感兴趣的:(RecyclerView嵌套ViewPager冲突,viewpager上划无效)