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只是左右滑动有些丑,也不知道当前位于第几页面. 可以在上方加入滑动指示条,来确定当前位置. 只需要修改 ...
随机推荐
- Hibernate之配置文件
可持久化对象有以下三种状态: 临时状态(Transient):对象在保存进数据库之前为临时状态,这时数据库中没有该对象的信息,如果没有持久化,程序退出后临时状态的对象信息将会丢失.随时可能被垃圾回收器 ...
- Linux--DNS服务器
DNS是Internet上使用最普遍,也是最重要的服务之一,通过DNS我们才可以访 问丰富多彩的网络,而DNS服务器就是为了实现域名解析功能而搭建的. 域名系统采用层次结构,按地理区域或机构区域 ...
- FFmpeg源代码简单分析:avcodec_open2()
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- 自定义圆角透明的Dialog
自定义圆角透明的Dialog 说明 系统默认的Dialog默认是背景不透明的,有时候项目需要Dialog为圆角透明,这个时候的解决方案就是---重写Dialog - 系统样式 - 自定义以后的样式 自 ...
- JAVA之旅(二十八)——File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤
JAVA之旅(二十八)--File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤 我们可以继续了,今天说下File 一.File概述 文件的操作是非常 ...
- Android开发工具下载地址
Android Studio: http://zdz.la/iq4zSa
- A*寻路算法入门(四)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- [C++学习历程]Visual Studio 2010 的HelloWorld
大学时期曾学过C++的知识,那时候也没有使用VS这样高档的IDE工具,就是C++6.0那样来的.对于重新拾起C++来说,换了个IDE,那么就先从使用IDE学起吧~ 作者:苏生米沿 本文链接:http: ...
- Cocos2D旋转炮塔到指定角度(二)
增加如下代码到ccTouchesEnded方法中,就在你在导弹精灵上调用runAction之前: // Determine angle to face float angleRadians = ata ...
- 11.4、Libgdx的音频之录制PCM音效
(官网:www.libgdx.cn) 可以通过AudioRecorder接口访问PCM数据.通过如下方式创建一个接口实例: AudioRecorder recorder = Gdx.audio.new ...