Android ViewPager和Slidingmenu手势冲突问题
尊重原创: http://blog.csdn.net/sk719887916/article/details/40043961 skay
想必大家都遇到过手势和焦点的问题 对于安卓初学者或者初次入职的开发人员或许是比较难的话题。
项目举例 如下图
需求:
图片是放在viewpager里面 实现轮播效果, 用户也可以左右滑动图片, 标题栏左右是个按钮 左边是更多 右边菜单 。
如果手指不在图片上,我们滑动屏幕默认是下方四个tab切换,到达最后一个(房子)弹出右边菜单,滑到第一个(五角星)弹出左边的侧滑菜单。
当手指处在图片时,我们滑动屏幕则需要是图片切换。
上图采用两个ViewPager+slidingmenu+ Fragment实现。广告Baner,也就是我们的ImageView所处的小的ViewPager,需要实现左右切换,整个首页的第一个Fragmen处在大的ViewPager中,那么这时候就会出现焦点混乱问题。
很多初次使以上两功能的人多会遇到这种问题 :比如我手在滑动图片上的时候 居然侧滑菜单出来了 而我们的想法是滑动查看图片 那么怎么做呢
先区分View和SlidingMenu:
我们给viewpager设置滑动监听OnPageChangeListener 我们可以自定义去实现此监听 关键代码如下
@Override
public void onPageSelected(int position) {
int lastPostion =adapter.getCount() - 1;
if (position == 0) {
((SlidingFragmentActivity) activity). getSlidingMenu().setMode(SlidingMenu.LEFT); // 第一个。SlidingMenu仅有左边有效
((SlidingFragmentActivity) getActivity()). getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
;
}
else if (position == lastPostion) {
/* ((SlidingFragmentActivity) activity). getSlidingMenu().setMode(SlidingMenu.RIGHT); // 最后一个。SlidingMenu仅有右边有效
*/ ((SlidingFragmentActivity) activity). getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}
else {
((SlidingFragmentActivity) activity). getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);// 中间,SlidingMenu无效 只有边沿有效
}
}
此方法就可以屏蔽slidingmenu抢焦点问题 现在就可以去试试了 搞定
区分大ViewPager和小ViewPager :
为了便于我们区分,给外层的ViewPager称之为FragmentVP, 小的ViewPager命名为ImageVP,如果对安卓时间不熟悉的请移步可以参考焦点事件文章 安卓Tv开发(一)焦点控制(触控事件),
那么抛开技术问题,我们首先想到:
1 当ImageVP可见,也就是滑到第一个Tab所指的Fragment时,我们需要获取图片的所在矩形范围。
2 当手指触摸范围在我们的矩形范围时,需要获得焦点,也就是主动要求焦点(requstFroce.
3 当手指触摸的位置不在图片的范围的,我们需要让FragmentVP获得焦点。
以上也只是初学者的理解,但是当我们真的代码这么去做的时候,发现上面方式无效,随之蛋疼的无法在蛋疼,于是楼主加了三天半还没搞定,最后阅读了事件源码,才发现原来罪魁祸首在于它。
理解了事件源码的朋友都知道,当我们手指按在图片上时,首先由最外层所处的Activity收到事件,以此分发传递到我们的图片上,那么这个时间在哪里被拦截了,也就是所消费了,我不断追踪断点,最后发现,原来再我们的最外层的FragmentVP所不在传递,由他的执行onTouchEvent()消费了。
1 )重写FragmentVP 的onInterceptTouch()不让拦截事件,具体我们返回fasle即可,
PS: 这里需要你做下if判断,所处手指在imageView上我们不拦截,反之拦截
2)当然到这里还不行,因为此时还会触发FragmentVP 的dispathTouchEvent(),还需要重载此方法,返回true,意思就是继续往下传递,具体事件原理请阅读上面的文章,这里只给出解决方法,
Ps:这里需要你做下if判断,所处手指在imageView上我们传递,反之不传递
3 我们还要去重写ImageVP的onTouchEvent()方法,让他消费此事件,具体我们返回true即可,
有了思路写起来很易,代码就不在贴了,谢谢阅读。
Android ViewPager和Slidingmenu手势冲突问题的更多相关文章
- 备忘-Android ViewPager 与Gallery滑动冲突解决方法
解决方法,重新定义gallery,禁止触发pager的触摸事件 1 public class UserGallery extends Gallery implements OnGestureListe ...
- Android ViewPager 里有子ViewPager的事件冲突
在Android应用中有时候要用到类似网易新闻左右滑动页面且页面里又有左右滑动的图片功能,我不知道网易是怎么实现的,本人的做法是外面的BaseFragmentActivity布局就是TabViewPa ...
- 当ViewPager嵌套在ScrollView/ListView里时,手势冲突如何处理?
有时我们需要将ViewPager嵌套在其他已经含有手势动作的ViewGroup里,如ScrollView,ListView时,会造成手势冲突,如表现为ViewPager向左划时,不小心向上移动了一点距 ...
- Android viewpager 嵌套 viewpager滑动 点击事件冲突解决方案
为了解决这个问题.可以自定义viewpager,然后在里面监听首饰,自定义点击事件 package com.hpuvoice.view; import android.content.Context; ...
- Android 中 DrawerLayout + ViewPager 怎么解决滑动冲突?
DrawerLayout 是 Android 官方的侧滑菜单控件,而 ViewPager 相信大家都很熟悉了.今天这里就讲一下当在 DrawerLayout 中嵌套 ViewPager 时,要如何解决 ...
- xamarin android viewpager的用法
1.什么是ViewPager 通过手势滑动可以完成view的切换,一般是用来app的引导页或则实现图片轮播,类似网页上的banner轮播. Adnroid 3.0后引入的一个UI控件,在xamarin ...
- 拖拽手势和清扫手势冲突时(UIPanGestureRecognizer和UISwipeGestureRecognizer冲突时)
故事发生在这样的情境上:给整个控制器添加了一个拖拽手势,然后又在控制上的每个Cell上加了左滑清扫手势,然后问题来了:只有拖拽手势起作用,而左滑手势没有效果了,然后怎么解决这个问题呢!先上图: 当给整 ...
- Android ViewPager 用法
Android ViewPager 用法 场景:一般第一次打开应用程序时,程序会有一个提示页来给展现应用程序都有哪些功能:或者程序更新时,又更新哪些新特性,都可以使用ViewPager Demo 描述 ...
- Android ViewPager再探:增加滑动指示条
上一篇:<Android ViewPager初探:让页面滑动起来> ViewPager只是左右滑动有些丑,也不知道当前位于第几页面. 可以在上方加入滑动指示条,来确定当前位置. 只需要修改 ...
随机推荐
- java类加载器——ClassLoader
Java的设计初衷是主要面向嵌入式领域,对于自定义的一些类,考虑使用依需求加载原则,即在程序使用到时才加载类,节省内存消耗,这时即可通过类加载器来动态加载. 如果你平时只是做web开发,那应该很少会跟 ...
- 指令汇B新闻客户端开发(五) ShareSdk的使用
ShareSdk是一个分享按钮的开源框架,我们首先可以去mob的官网下载这个控件.mob官网,然后找到sdk下载那一栏, 下载下来之后点击这个.jar文件就会有一个弹窗,填写自己的应用包名和要哪些分享 ...
- Swift中声明协议中的class关键字的作用
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近在Cocos2D编程for Swift中看到以下一个代码片 ...
- 4.QPixmap,QTransform,绘图函数的使用
新建一个项目Painter MyWidget.h #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> class MyW ...
- 一个ExtJS实例
聊聊ExtJS 这几天接触了一个项目 前台用的是extjs 发现这个东西还是有点意思的 就把前台的部分 剥离了下来 有兴趣的朋友可以当做模板学习 不多说先上效果图 这篇文章 可以看作是ext知识的一 ...
- 最简单的基于FFmpeg的libswscale的示例附件:测试图片生成工具
===================================================== 最简单的基于FFmpeg的libswscale的示例系列文章列表: 最简单的基于FFmpeg ...
- Unable to instantiate Action, MenuAction, defined for 'QueryMenuAll' in namespace '/'MenuAction
我刚好也遇到这样的情况,发现是自己的配置文件里写错了,spring里的id属性值要对应struts里class属性值.
- Java项目源码为什么要做代码混淆(解释的很好)
代码混淆,是将计算机程序的代码转换成一种功能上等价,但是难于阅读和理解的形式的行为.代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码.执行代码混淆的程序被称作代码混淆器.目前已经存在许多种 ...
- OpenCV3.0 3.1版本的改进
摘要 OpenCV现在更新到了3.1版本,相对OpenCV2有了很大改进,其中对于硬件加速,移动开发(IOS,android)的支持成为亮点. 新版的OpenCV采用了内 ...
- ASP.NET实现网页版小优盘
今天看到了一篇不错的文章,就拿来一起分享一下吧. 实现的是文件的上传与下载功能. 关于文件上传: 谈及文件上传到网站上,首先我们想到的就是通过什么上传呢?在ASP.NET中,只需要用FileUploa ...