时间:2021-05-20
接手一个项目,有一个问题需要修改:轮播图不能手动滑动,手动滑动轮播图只会触发侧滑菜单。
猜测: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); }再次编译运行,成功达到预期效果。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了vueswiper实现侧滑菜单效果的具体代码,供大家参考,具体内容如下先上效果图:这个左右滑动以及上下滑动主要使用了Swiper的轮播功能,
实例如下://解决ViewPager和轮播图滑动冲突@OverridepublicbooleandispatchTouchEvent(MotionEventev
简单介绍这个demo写的是仿京东的侧滑筛选页面,点击进入筛选后进入二级筛选,两次侧滑的筛选,还包括ListView+CheckBox滑动冲突,ListView+
先看看QQ的侧滑效果分析一下先上原理图(不知道能否表达的清楚==)-首先这里使用了Android的HorizontalScrollView水平滑动布局作为容器,
本文实例为大家分享了Android实现侧滑菜单的具体代码,供大家参考,具体内容如下点击左侧滑动效果如下代码实现过程:1.导入框架build.gradle中//m