Android中的View事件传递机制

这两天刚好研究View工作原理,看到事件传递机制时,查阅了网上的几篇博文,看完之后有点印象但不是很清晰。看源码嘛更是难以啃下,而博文下的评论又有说原博文不对的地方。搞得自己都头大了。最终参考了几篇,自己整理了下思路,用visio画了几幅工作流程出来,如果有什么不对的地方,希望有大牛指正。


总的情况如下:





图说话,上面是总的事件流向情况分析流程


1.默认情况下:

各viewgroup和view,默认的DispatchTouchEvent和onInterceptTouchEvent以及TouchEvent的返回值默认都是false。以ACTION_DOWN为例,事件从Activity一直依次经历每个Viewgroup的DispatchTouchEvent和onInterceptTouchEvent向下传递至最底层的view。由于底层的view的onTouchEvent默认返回的是false,表示该view不消费此事件,于是此事件会上浮给父容器的onTouchEvent处理,父容易的onTouchEvent默认也返回false,于是继续上浮,直到被Activity消费,后续的ACTION_MOVE和ACTION_UP也会直接被Activity的onTouchEvent消耗而不经过其他函数。

如下图





2.被其中的控件截获但不消费的情况:

当layout_2的onInterceptTouchEvent返回true时,意味着事件被layout_2截获,事件不再向子控件传递,而是直接传给自己的onTouchEvent。onTouchEvent处理后还是返回false,表示不消费此事件。因此,事件再次从各个控件的onTouchEvent中上浮,直到被Activity中的onTouchEvent消费。后续的ACTION_MOVE和ACTION_UP依然不再经历其他控件而直接被Activity消费掉。

如下图:


3.被其中的控件截获并消费掉的情况:

事件被layout_2截获了之后,被传递到了它自己的onTouchEvent之后,经过处理后onTouchEvent返回true,以为着此事件被其消费掉了。因此事件不会再传递给其他控件。此时,layout_2会被认定为目标控件,后续的ACTION_MOVE和ACTION_UP也只会传递给此控件而不经过其他控件,同时会传递ACTION_CANCLE给子控件。

如下图:



注意:ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。


其他的懒得说了。如果还不明白的话,可以参考下面几篇挺不错的博文:

http://blog.csdn.net/ff20081528/article/details/17353869

http://blog.csdn.net/chenzhiqin20/article/details/8816364

http://www.cnblogs.com/kingcent/archive/2011/03/08/1977064.html


要是还是不懂的话,哈哈,智商捉急问题嘿嘿


转载请注明出处~~~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值