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

Android侧滑菜单和轮播图之滑动冲突问题,第1张

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

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

猜测: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:006-08 09:52:08.395 19424-19424/com.parkingmore E/SlIDingMenu: onIntercepttouchEvent ev:006-08 09:52:08.395 19424-19424/com.parkingmore E/RollVIEwPager: dispatchtouchEvent ev:006-08 09:52:08.395 19424-19424/com.parkingmore E/RollVIEwPager: onIntercepttouchEvent ev:006-08 09:52:08.441 19424-19424/com.parkingmore E/SlIDingMenu: dispatchtouchEvent ev:206-08 09:52:08.441 19424-19424/com.parkingmore E/SlIDingMenu: onIntercepttouchEvent ev:206-08 09:52:08.442 19424-19424/com.parkingmore E/SlIDingMenu: ACTION_MOVE dx:15.47399906-08 09:52:08.442 19424-19424/com.parkingmore E/RollVIEwPager: ACTION_MOVE getCurrentItem():106-08 09:52:08.442 19424-19424/com.parkingmore E/RollVIEwPager: dispatchtouchEvent ev:206-08 09:52:08.442 19424-19424/com.parkingmore E/RollVIEwPager: onIntercepttouchEvent ev:206-08 09:52:08.459 19424-19424/com.parkingmore E/SlIDingMenu: dispatchtouchEvent ev:206-08 09:52:08.459 19424-19424/com.parkingmore E/SlIDingMenu: onIntercepttouchEvent ev:206-08 09:52:08.459 19424-19424/com.parkingmore E/RollVIEwPager: dispatchtouchEvent ev:306-08 09:52:08.459 19424-19424/com.parkingmore E/RollVIEwPager: onIntercepttouchEvent ev:306-08 09:52:08.477 19424-19424/com.parkingmore E/SlIDingMenu: dispatchtouchEvent ev:206-08 09:52:08.477 19424-19424/com.parkingmore E/SlIDingMenu: ontouchEvent ev:206-08 09:52:08.495 19424-19424/com.parkingmore E/SlIDingMenu: dispatchtouchEvent ev:206-08 09:52:08.495 19424-19424/com.parkingmore E/SlIDingMenu: ontouchEvent ev:206-08 09:52:08.515 19424-19424/com.parkingmore E/SlIDingMenu: dispatchtouchEvent ev:206-08 09:52:08.515 19424-19424/com.parkingmore E/SlIDingMenu: ontouchEvent ev:206-08 09:52:08.533 19424-19424/com.parkingmore E/SlIDingMenu: dispatchtouchEvent ev:206-08 09:52:08.533 19424-19424/com.parkingmore E/SlIDingMenu: ontouchEvent ev:206-08 09:52:08.551 19424-19424/com.parkingmore E/SlIDingMenu: dispatchtouchEvent ev:206-08 09:52:08.551 19424-19424/com.parkingmore E/SlIDingMenu: ontouchEvent ev:206-08 09:52:08.574 19424-19424/com.parkingmore E/SlIDingMenu: dispatchtouchEvent ev:206-08 09:52:08.574 19424-19424/com.parkingmore E/SlIDingMenu: ontouchEvent ev:206-08 09:52:08.594 19424-19424/com.parkingmore E/SlIDingMenu: dispatchtouchEvent ev:206-08 09:52:08.595 19424-19424/com.parkingmore E/SlIDingMenu: ontouchEvent ev:206-08 09:52:08.611 19424-19424/com.parkingmore E/SlIDingMenu: dispatchtouchEvent ev:206-08 09:52:08.612 19424-19424/com.parkingmore E/SlIDingMenu: ontouchEvent ev:206-08 09:52:08.622 19424-19424/com.parkingmore E/SlIDingMenu: dispatchtouchEvent ev:206-08 09:52:08.622 19424-19424/com.parkingmore E/SlIDingMenu: ontouchEvent ev:206-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);  }

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

总结

以上是内存溢出为你收集整理的Android侧滑菜单和轮播图之滑动冲突问题全部内容,希望文章能够帮你解决Android侧滑菜单和轮播图之滑动冲突问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存