深入Android Touch事件传递机制

随着android学习的深入,发现Android中的Touch事件是一个你必须要啃的硬骨头,本人花了一些时间去搞明白这些事,不敢说搞的非常透彻,但也绝不是浅尝辄止。下面我就用最通俗的话分享给大家。

一、什么是Touch事件/机制

即是用户用手指头放到手机屏幕上到手指头全部离开的整个过程(也叫一次事件)。有可能只是简单的ACTION_DOWN(按下) ->ACTION_MOVE(在屏幕上移动)… -> ACTION_UP(抬起),也可能有ACTION_CANCLE,系统调用,然后事件结束;也有可能是ACTION_DOWN ->ACTION_POINTER_DOWN(第二个手指按下) -> ACTION_MOVE… -> ACTION_POINTER_UP(多个手指按下时,抬起一个手指时)-> ACTION_UP。其实不管怎样,整个思路就是手指头放到手机屏幕上到手指头全部离开的整个过程

二、对于这一次事件,系统做了什么,系统是怎么来处理这些事件的?

这个问题才是关键!解决这个问题需要先了解两个知识,第一,大家都知道Android视图的架构,ViewGroup里面可以包含ViewGroup和子View,内存允许的情况下无限嵌套(当然也没人那么干)。第二,touch事件传递和拦截,是通过三个跟touch有关的方法完成的,dispatchTouchEvent、onInterceptTouchEvent(ViewGroup里定义)、onTouchEvent,这里就举一个例子来解释这几个函数的作用! LinearLayout(以后的LinearLayout我就简称L)里面有个Button,如果用户触摸到了Button,首先ACTION_DOWN事件传递给L(如果L外面还有ViewGroup,那么事件肯定是先传递给最外层的ViewGroup,现在就当布局里面就一个L,L里面有个Button),首先ACTION_DOWN 先被送到L的dispatchTouchEvent里,这里是用来判断事件是不是分发给子View和分发给哪个子View的,在ViewGroup的源码里该方法里会调用onInterceptTouchEvent,这样ACTION_DOWN,就到了L的onInterceptTouchEvent方法,这个方法的返回值决定本次事件要不要拦截不给你的儿子(子View)?①、如果返回true,那么本次事件子View将捕获不到,就会执行自己的onTouchEvent。执行完,然后到了L的dispatchTouchEvent方法返回,该方法的返回值是在告诉系统,下一次事件,我还要不要,如果是true,那么意思是下一次事件我还要,如果是false,那么意思是我啥也不想干了,事件不要再来了。②、返回false,那么ACTION_DOWN就到了Button的dispatchTouchEvent方法,它和L的dispatchTouchEvent稍有不同,它不会去判断触摸的地方是那个View所在的区域,他会执行Button的onTouchEvent,这样ACTION_DOWN就到了Button的onTouchEvent,执行完返回,然后到了Button的dispatchTouchEvent方法返回,该方法的返回值是在告诉系统,下一次事件,我还要不要,如果是true,那么意思是下一次事件我还要,如果是false,那么意思是我啥也不想干了,事件不要再来了。

Button的onTouchEvent返回值的true与false决定了这一个事件(注意是一个事件而不是一次事件)是被谁消费掉,如果return true,那么button消费掉这一个事件,父View,L的onTouchEvent将得不到调用,如果reutrn false那么事件由父View L的onTouchEvent来处理,L处理后返回true与false,同样道理,如果true事件被消费掉,如果false那么就交给Activity的onTouchEvent来处理。整个ACTION_DOWN就结束了,哇,一个ACTION_DOWN就这么复杂,如果你这么觉得的话那就是没看懂我上面说的,多读几遍,我上面说的是事件的传递机制,不管是ACTION_DOWN、ACTION_MOVE还是ACTION_UP它的机制都是这样的,所以,搞明白这个就OK了。其实我上面说的返回值,如果返回true怎么样,返回false怎么样,那是针对你自己需求时,就像一些系统原有的控件Button、ListView等,如果没有特殊处理它们的onTouchEvent是一定返回true的。那么如果想触摸listview完成,侧滑或者上拉下拉等,就只能在listView的外面写一个ViewGroup等,在这个自定义的ViewGroup中得到用户的事件,判断出用户的意图,从而确定把事件分发给谁处理。

三、事件传递的顺序-附加篇

如果你不是很了解触摸事件的传递顺序,那么这里我可以很负责的告诉你,听好了,首先你的触摸事件会传递给最外层的View(当然它一般是ViewGroup),即是你layout文件里面,最外层的那个View,如果你这个View里面有很多子View,系统会判断你触摸的区域是那个子View所在的区域,然后事件传递给最外层View的子View,如果子View里面还有子View,OK,继续走你,就这样一层一层的传递给你触摸的那个View,所以这里也可以看出,在布局文件里嵌套太多是很浪费性能的。如果View的onTouchEvent返回false,传递过程中的View的onTouchEvent都返回false,那么事件传递给视图所在的活动(Activity)。有一个视图onTouchEvent返回了true,那么活动的onTouchEvent就不会被调用

------如果是你一个想学东西,但是遇到不明之处,请联系QQ 1181219972 验证信息:Android战士

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值