(转载)Android滑动冲突的完美解决
Android滑动在智能手机上是必备的操作,但是在开发的时候,你是否和我一样,经常会遇到滑动冲突的问题,比如最简单需要在ListView里面添加一个侧滑动作,这时候冲突时必然的,那我们该如何解决这个问题呢? 
先来说一下滑动冲突都有那些,该怎么解决。
场景一:类似于ViewPager嵌套Fragmnet并且在Fragmnet中嵌套了一个ListView的效果,可以通过左右滑动来切换或者触发其他view的显示。但是在ViewPager内部已经处理了这个冲突,所以我们会发现ViewPager嵌套Fragmnet的时候很是流畅。如果我们采用的不是ViewPager而是ScrollView,那么就需要我们主动去处理这个冲突了; 
场景二:这种情况比较复杂,那就是view和被嵌套的view需要在同一个方向上滑动,这时候,用户滑动view的时候,系统就不知道用户想要滑动的view是哪一个,问题就不由自主的跳出来了; 
场景三:场景三是最为复杂的一种,即有场景一的情况,也有场景二的情况,两种情况的叠加,所以需要处理内部和中部、中部和和外部的冲突。
问题已经出来了,那我们怎么解决呢?
view既然可以滑动,那么就有滑动的规律,一般来说,当用户滑动时,需要让外部的view拦截点击事件,当用户上下滑动时,需要让内部view拦截view的点击事件,这时候,我们就可以根据是上下还是左右滑动来具体处理冲突事件。对于场景二和场景三,大致的想法也是差不多的,修改相关的滑动规则就OK了。
1、外部拦截: 
所谓的外部拦截是指点击事件都先经过父容器的拦截处理,如果有需要就去拦截,否则不拦截,这样就可以简单的处理场景一的问题了。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | publicbooleanonInterceptTouchEvent(MotionEvent event){ booleanintercepted=false; intx=(int)event.getX(); inty=(int)event.getY(); switch(event.getAction()){ caseMotionEvent.ACTION_DOWN:  break; caseMotionEvent.ACTION_MOVE:  if(父容器需要当前点击事件){  intercepted=true;  }else{  intercepted=false;  }  break; caseMotionEvent.ACTION_UP:  intercepted=false;  break; default:  break;  } mLastXIntercepted=x; mLastYIntercepted=y; returnintercepted;} | 
上面的代码是最基础的外部拦截逻辑,针对不同的情况,修改父容器需要的条件即可。当点击view和释放view的时候,我们不需要处理滑动操作,只需要当拖动view的时候,需要去拦截就OK了。
2、内部拦截:
内部拦截和外部拦截正好相反,指的是所有的事件都传递给子view来处理,如果需要,子view直接消费掉,否则不消费。这里消费是指子view处理掉父容器传递过来的事件。这种方法需要配合requestDisallowInterceptedTouchEvent方法才行:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | publicbooleandispatchTouchEvent(MotionEvent event){ intx=(int)event.getX(); inty=(int)event.getY(); switch(event.getAction()){ caseMotionEvent.ACTION_DOWN:  parent.requestDisallowInterceptedTouchEvent(true);  break; caseMotionEvent.ACTION_MOVE:  intdeltaX=x-mLastX;  intdeltaY=y-mLastY;  if(父容器需要点击事件){  parent.requestDisallowInterceptedTouchEvent(false);  }  break; caseMotionEvent.ACTION_UP:  intercepted=false;  break; default:  break;  } mLastX=x; mLastY=y; returnsuper.dispatchTouchEvent(event);} | 
子view除了需要处理以外,父容器默认拦截除了按下事件以外的所有事件,这样才能让子view调用requestDisallowInterceptedTouchEvent方法时,父容器继续去拦截其他事件。这是典型的内部拦截处理方案。在这里你可能很疑惑,为什么父容器不能拦截ACTION_DOWN事件呢?那是因为ACTION_DOWN事件不受FLAG_DISALLOW_INTERCEPT这个标记的控制,如果父容器拦截ACTION_DOWN事件,那么所有的事件都不可能传递给子view了,这样的拦截根本就不能达到我们的目的。
至于场景三的解决方案,根据情况不同,微调方案一和方案二即可。
解决滑动冲突的方案就这么多,而开篇提到的问题,显然是可以使用方案一来解决的。
如对本文有疑问,请提交到交流社区,广大热心网友会为你解答!! 点击进入社区
您可能感兴趣的文章:
相关文章
- 2013-06-06android 放大镜ShapeDrawable妙用分享
- 2017-05-05Android开发之DrawerLayout实现抽屉效果
- 2017-06-06详解Android 在 ViewPager 中使用 Fragment 的懒加载
- 2015-05-05Android Studio使用教程(五):Gradle命令详解和导入第三方包
- 2017-04-04Android自定义View模仿QQ讨论组头像效果
- 2013-05-05Android 判断SIM卡属于哪个移动运营商的实现代码
- 2017-05-05Android仿360市场下载按钮的实现方法
- 2015-10-10Android自定义Spinner下拉列表(使用ArrayAdapter和自定义Adapte
- 2013-05-05Android开发笔记之:一分钟学会使用Logcat调试程序的详解
- 2017-02-02Android Activity跳转动画效果
(转载)Android滑动冲突的完美解决的更多相关文章
- 关于Android滑动冲突的解决方法(二)
		之前的一遍学习笔记主要就Android滑动冲突中,在不同方向的滑动所造成冲突进行了了解,这样的冲突非常easy理解,当然也非常easy解决.今天,就同方向的滑动所造成的冲突进行一下了解,这里就先以垂直 ... 
- Django与Vue语法冲突问题完美解决方法
		当我们在django web框架中,使用vue的时候,会遇到语法冲突. 因为vue使用{{}},而django也使用{{}},因此会冲突. 解决办法1: 在django1.5以后,加入了标签: {% ... 
- Android滑动冲突解决方法
		叙述 滑动冲突可以说是日常开发中比较常见的一类问题,也是比较让人头疼的一类问题,尤其是在使用第三方框架的时候,两个原本完美的控件,组合在一起之后,忽然发现整个世界都不好了. 关于滑动冲突 滑动冲突分类 ... 
- Android滑动冲突解决
		(1).场景一:外部滑动方向跟内部滑动方向不一致,比如外部左右滑动,内部上下滑动 ViewPager+Fragment配合使用,会有滑动冲突,但是ViewPager内部处理了这种滑动冲突 如果 ... 
- Android 滑动冲突处理
		要想解决滑动冲突就必须好好理解 Android 的事件分发机制.不了解 Android 事件分发机制的请先参考资料学习一下. 一般有 2 种方法 1 外部拦截法 这个非常简单,因为事件是从父 view ... 
- 每日一问:Android 滑动冲突,你们都是怎样处理的
		坚持原创日更,短平快的 Android 进阶系列,敬请直接在微信公众号搜索:nanchen,直接关注并设为星标,精彩不容错过. 在 Android 开发中,滑动冲突总是我们一个无法避免的话题.而对于解 ... 
- android SDK 更新问题完美解决  http://dl-ssl.google.com refused
		现在由于GWF,google基本和咱们说咱见了,就给现在在做Android 或者想学习Android 的朋友带来了诸多的不便,最简单的就是Android SDK Manager 你无法更新了. 现在 ... 
- android 滑动冲突
		韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 通过move事件的 拦截. 在滑动组件中,重写 在拦截触摸事件的时候 这个方法, 然后 ... 
- Android实践之ScrollView中滑动冲突处理
		转载注明出处:http://blog.csdn.net/xiaohanluo/article/details/52130923 1. 前言 在Android开发中,假设是一些简单的布局.都非常easy ... 
随机推荐
- HTML文档  html,html5,css,css3
			HTML 各种标签及简单应用: http://www.w3school.com.cn 1 <p><p> 2 <br/> 3 <hr/>横线 4 < ... 
- Android 数字四舍五入
			BigDecimal b = new BigDecimal(hour).setScale(1, BigDecimal.ROUND_HALF_UP); setScale(int newScale, in ... 
- Hibernate配置文件 hibernate.cfg.xml
			<!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1.0' ... 
- 用一个小的例子来说明为什么TCP采用三次握手才能保证连接成功
			关于TCP的三次握手,有很多朋友还在疑惑为什么是三次,而不是两次,LZ想了一下用一个例子来说明最好. 场景: 办公室有一名前台(服务器),若干业务员(fork出来的进程) 客户(客户端) 为什么我 ... 
- Unity 脚本挂载位置
			原则:谁的脚本,挂载到谁身上 1,一般场景中会有个GameController脚本,挂在空物体上. 2,我见很多人脚本习惯挂到Camera上,好吧,不知算不算规范. 
- MAC 下的pycharm部分使用方法
			1.在创建之初,可以选择自己想要使用的python版本. 如果之后想要更换Python版本,可以通过~~~更换选择Python版本. 2.创建.py文件,点击文件名,出现如下界面: 点击new--py ... 
- 工作流Activiti学习地址
			http://blog.csdn.net/xnf1991/article/details/52610277 
- Pyhton学习——Day41
			#一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:# 核心(ECMAScript)# 文档对象模型(DOM) Document object model (整合js,css,ht ... 
- Day 01 计算机编程基础
			1.编程语言是什么? 编程语言是人与计算机交流的介质 2.什么是编程? 用编程语言写出一个个文件,这堆文件会达到一个目的 3.编程有什么用? 让计算机帮助我们干活,从而解放人类劳动力 4.计算机组成原 ... 
- 在centos里安装Nginx
			(1)下载Nginx的RPM包 wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx ... 
