RecyclerView 嵌套 ViewPager 上下滑动问题

2017-08-09  本文已影响0人  雪_枫

先看下效果

GIF.gif

效果上可以看到 有下拉刷新Banner还需要可以滑动

网上找了一圈都没有相关的,要么就是改RecyclerView的要么就是改ViewPager然后验证了之后都不管用。
后来还是根据网上ListView嵌套ViewPager部分代码修改完成实现想要的效果。

提一下,在实现的时候 public boolean dispatchTouchEvent(MotionEvent ev) 这个方法里添加的事件分发并不管用,而网上很多都是在这个方法里进行实现的。

项目中用到的是LoopRecyclerViewPager这个类,然后自己重写的,所以也有可能是继承的类不一样所以方法不生效的问题


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 {
                    // 这里返回False 事件自己消费了,不用往下传递。
                    return false;
                }
            } else {
                // 通知父控件进行事件拦截
                getParent().requestDisallowInterceptTouchEvent(false);
            }
        }
        return super.onTouchEvent(ev);
    }

上面的算是记录下项目中踩到的坑吧,以后可能还会遇到同样的问题。有些地方描述的可能也有错,请指证。

上一篇下一篇

猜你喜欢

热点阅读