欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-05 23:30:10
接手一个项目,有一个问题需要修改:轮播图不能手动滑动,手动滑动轮播图只会触发侧滑菜单。 猜测:viewpager控件(轮播图)的触摸事件被slidingmenu控件(侧滑...

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

猜测: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

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

在slidingmenu中,做出如下处理

public boolean onintercepttouchevent(motionevent ev) {
    if (myapplication.mrollviewpagertouching){
      return false;
    }
    return super.onintercepttouchevent(ev);
  }

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

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

这里有两个地方要注意: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);
  }

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