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);
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容