Android侧滑菜单和轮播图之滑动冲突

Posted 掌握当下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android侧滑菜单和轮播图之滑动冲突相关的知识,希望对你有一定的参考价值。

接手一个项目,有一个问题需要修改:轮播图不能手动滑动,手动滑动轮播图只会触发侧滑菜单。

 

猜测:viewpager控件(轮播图)的触摸事件被SlidingMenu控件(侧滑菜单,非第三方项目,乃是上个开发人员自定义的)拦截了。

 

基于这个猜测,我自定义一个ViewPager,重写dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent,分别在这三个方法中打印log;

重写SlidingMenu的dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent,同样打印log。

 

重新编译运行,手滑轮播图,log如下:

技术分享
06-08 09:52:08.394 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:0
06-08 09:52:08.395 19424-19424/com.parkingmore E/SlidingMenu: onInterceptTouchEvent ev:0
06-08 09:52:08.395 19424-19424/com.parkingmore E/RollViewPager: dispatchTouchEvent ev:0
06-08 09:52:08.395 19424-19424/com.parkingmore E/RollViewPager: onInterceptTouchEvent ev:0
06-08 09:52:08.441 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.441 19424-19424/com.parkingmore E/SlidingMenu: onInterceptTouchEvent ev:2
06-08 09:52:08.442 19424-19424/com.parkingmore E/SlidingMenu: ACTION_MOVE dx:15.473999
06-08 09:52:08.442 19424-19424/com.parkingmore E/RollViewPager: ACTION_MOVE getCurrentItem():1
06-08 09:52:08.442 19424-19424/com.parkingmore E/RollViewPager: dispatchTouchEvent ev:2
06-08 09:52:08.442 19424-19424/com.parkingmore E/RollViewPager: onInterceptTouchEvent ev:2
06-08 09:52:08.459 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.459 19424-19424/com.parkingmore E/SlidingMenu: onInterceptTouchEvent ev:2
06-08 09:52:08.459 19424-19424/com.parkingmore E/RollViewPager: dispatchTouchEvent ev:3
06-08 09:52:08.459 19424-19424/com.parkingmore E/RollViewPager: onInterceptTouchEvent ev:3
06-08 09:52:08.477 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.477 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.495 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.495 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.515 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.515 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.533 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.533 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.551 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.551 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.574 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.574 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.594 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.595 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.611 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.612 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.622 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.622 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.623 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:1
View Code

从log中可以看出,该开始,还能将滑动事件传递给ViewPager,之后,就被SlidingMenu拦截了。这个log证实了这个猜想是正确的。

 

知道了原因就好解决了,我现在要考虑的是:要达到什么样的效果。

 

预期效果:可以正常滑动轮播图,当轮播图在第一张时,可以滑到侧滑菜单。

 

网上有人分享过类似的问题。我这里也借鉴了一下。

 

先来实现第一个功能:可以正常滑动轮播图。

 

可以设一个全局变量:public static boolean mRollViewPagerTouching;

用来表示是否在触摸轮播图。

 

在自定义ViewPager中,判断是否在触摸轮播图

技术分享
public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_DOWN:
                MyApplication.mRollViewPagerTouching = true;
                break;
            case MotionEvent.ACTION_UP:
                MyApplication.mRollViewPagerTouching = false;
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
View Code

在SlidingMenu中,做出如下处理

技术分享
public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (MyApplication.mRollViewPagerTouching){
            return false;
        }
        return super.onInterceptTouchEvent(ev);
    }
View Code

 

重新编译运行,可以正常滑动轮播图,但是当轮播图在第一张时,不能滑到侧滑菜单。

 

现在来做第二个功能:当轮播图在第一张时,可以滑到侧滑菜单。

这里有两个地方要注意:1.当轮播图在第一张时;2.由于我的侧滑菜单是在左边,需要手指向右滑动进入侧滑菜单,所以,第二个条件,应该是右滑。

在以上的基础上,修改自定义ViewPager代码

技术分享
public boolean dispatchTouchEvent(MotionEvent ev) {
        //在触发时回去到起始坐标
        float x = ev.getX();
        switch (ev.getAction()) {
            case MotionEvent.ACTION_MOVE:
                //获取到距离差
                float dx = x - downX;
                //防止是按下也判断
                if (Math.abs(dx) > 8) {
                    //通过距离差判断方向
                    if (dx > 0) {
                        //                                "右";
                        if (getCurrentItem() == 0) {
                            MyApplication.mRollViewPagerTouching = false;
                        } else {
                            MyApplication.mRollViewPagerTouching = true;
                        }
                    } else {
                        //                                "左";
                        MyApplication.mRollViewPagerTouching = true;
                    }
                }
                break;
            case MotionEvent.ACTION_DOWN:
                //将按下时的坐标存储
                downX = x;
                MyApplication.mRollViewPagerTouching = true;
                break;
            case MotionEvent.ACTION_UP:
                MyApplication.mRollViewPagerTouching = false;
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
View Code

 

再次编译运行,成功达到预期效果。

 

ps:简单的功能,简单的分享。

 

以上是关于Android侧滑菜单和轮播图之滑动冲突的主要内容,如果未能解决你的问题,请参考以下文章

01.轮播图之四 :imageViews(2 或者 3 个imageview) 轮播

东京商城主页中部商品分类和轮播图代码的编写

js学习总结----轮播图之渐隐渐现版

01.轮播图之二 :tableView 轮播

简要分析javascript的选项卡和轮播图

01.轮播图之五 :一个 imageView也能 作 轮播