现在的位置: 首页 > 移动开发 > 正文

Android中的View事件传递机制

2018年01月11日 移动开发 ⁄ 共 1365字 ⁄ 字号 评论关闭

这两天刚好研究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

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

转载请注明出处~~~

抱歉!评论已关闭.