解决ViewPager2嵌套ViewPager再嵌套GridView滑动冲突

ViewPager2嵌套ViewPager再嵌套GridView

效果图

效果图

先重写ViewPager

如果用onInterceptTouchEvent拦截会导致GridView的item不能点击,所以用dispatchTouchEvent进行拦截

int downX = 0;
    int downY = 0;
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        //int downX = 0;        这里赋值downX,downY会一直为0;要转为成员变量
        // int downY = 0;
        //y轴方向需要考虑移动整个模块,让其支持下拉刷新
        //在用系统的事件处理机制之前,先让自定义的viewpager满足我们自己定义的规则
        //viewpager选中最后一个点的时候,由右向左滑动,需要让整个模块进行翻转
        //viewpager选中第一个点的时候,由左向右滑动,需要让整个模块进行翻转
        //其余情况,翻转viewpager中的图片
        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                downX = (int) ev.getX();
                downY = (int) ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                int moveX = (int) ev.getX();
                int moveY = (int) ev.getY();
                if(Math.abs(moveX-downX)<Math.abs(moveY-downY)){
                    //y轴上的偏移量比x轴上的偏移量更多,可能会触发下拉刷新,需要响应事件的是大的模块
                    //请求不拦截触摸事件(不是这样的,要拦截)
                    getParent().requestDisallowInterceptTouchEvent(false);//让viewpager告知其父容器要拦截响应事件
                }else{
                    //x轴偏移量大于y轴偏移量情况
                    if (moveX-downX<0){
                        //由右向左移动,最后一个点,翻转整个模块
                        if (getCurrentItem() == getAdapter().getCount()-1){
                            getParent().requestDisallowInterceptTouchEvent(false);//让viewpager告知其父容器要拦截响应事件
                        }else if (getCurrentItem()<getAdapter().getCount()-1){
                            getParent().requestDisallowInterceptTouchEvent(true);//让viewpager告知其父容器不要拦截响应事件
                        }
                    }else{
                        //由左向右移动,第一个点,翻转整个模块
                        if (getCurrentItem() == 0){
                            getParent().requestDisallowInterceptTouchEvent(false);//让viewpager告知其父容器要拦截响应事件
                        }else if (getCurrentItem()>0){
                            getParent().requestDisallowInterceptTouchEvent(true);//让viewpager告知其父容器不要拦截响应事件
                        }
                    }
                }
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容