[重写开源框架源码]InfiniteViewPager在ScrollView中不能竖直滑动问题解决

笔者在项目中使用到InfiniteViewPager这个开源框架作为广告轮播,确实挺好用的,但却发现了一个问题:InfiniteViewPager在ScrollView中不能竖直滑动。

它的开源地址:https://github.com/waylife/InfiniteViewPager

于是笔者打开它的源码,找到这个文件InfiniteViewPager.java ,在onInterceptTouchEvent方法里找到这句话:

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        //to solve conflict with parent ViewGroup
        getParent().requestDisallowInterceptTouchEvent(true);
        if (this.mAutoScroll || this.mTouchedWhenAutoScroll) {
            int action = ev.getAction();
            switch (action) {
                case MotionEvent.ACTION_DOWN:
                    this.mTouchedWhenAutoScroll = true;
                    stopAutoScroll();
                    break;
            }
        }
        return super.onInterceptTouchEvent(ev);
    }

当中有一行代码写:getParent().requestDisallowInterceptTouchEvent(true);

这行代码是告诉父容器:不要拦截“我”的事件。也就说,触摸/滑动事件一直从顶级view分发到了当前控件,当这个控件在ScrollView中,在竖直滑动时,实际上ScrollView是拿不到滑动事件的,因为已经分发到了InfiniteViewPager,于是乎ScrollView不能竖直滑动。

笔者在这里的解决办法是:
①删除原有的事件拦截代码,把以下代码删除了

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        //to solve conflict with parent ViewGroup
        getParent().requestDisallowInterceptTouchEvent(true);
        if (this.mAutoScroll || this.mTouchedWhenAutoScroll) {
            int action = ev.getAction();
            switch (action) {
                case MotionEvent.ACTION_DOWN:
                    this.mTouchedWhenAutoScroll = true;
                    stopAutoScroll();
                    break;
            }
        }
        return super.onInterceptTouchEvent(ev);
    }

②增加dispatchTouchEvent事件拦截

    private int mLastX;
    private int mLastY;
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        int x = (int) ev.getX();
        int y = (int) ev.getY();
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                getParent().requestDisallowInterceptTouchEvent(true);
                if (this.mAutoScroll || this.mTouchedWhenAutoScroll) {
                    this.mTouchedWhenAutoScroll = true;
                    stopAutoScroll();
                }
                Log.d("debug", "dispatch action down");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d("debug", "dispatch action move");
                int xDiff = Math.abs(x - mLastX);
                int yDiff = Math.abs(y - mLastY);
                Log.d("debug", "xDiff" + xDiff + "\nyDiff" + yDiff);
                if (xDiff < yDiff) {
                    getParent().requestDisallowInterceptTouchEvent(false);
                } else {
                    getParent().requestDisallowInterceptTouchEvent(true);
                }
                break;
        }
        mLastX = x;
        mLastY = y;
       return super.dispatchTouchEvent(ev);
    }

到这里,大功告成。

发布了48 篇原创文章 · 获赞 49 · 访问量 9万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览