博客地址 | http://www.cnblogs.com/wangle12138/tag/Android/
声明 | 作者系列文章,原创投稿,转发等联系原作者授权。
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!另外,本系列文章知识可能需要有一定Android开发基础和项目经验的同学才能更好理解,也就是说该系列文章面向的是Android中高级开发工程师。
系列第六篇了,接着上一篇说,在上一篇文章中我们上了一个小例子来自定义View,文章比较简单,阅读量几乎没有,有灌水的嫌疑,(实际上没有,每一篇文章我都是用心在写)。这一篇文章呢,我们来看一下Android事件的分发机制。关于这方面的知识大概已经被讲烂了。我本人也看了好多关于这方面优质的文章和博客。可以说是受益匪浅,但是可是总觉得没有掌握完全。所以我去看了关于底层源码的一些知识。然后在这里分享给大家。
当我们的手指从触摸到屏幕上的各种View开始到这个点击事件结束到底经历了什么,我们来详细分析一下。(Android的输入系统处理了很多事件,包括按键,触摸,以及外接设备,但是我们这篇文章只分析我们最熟悉也是最常用的触摸事件,这里的描述也许不太精确,但是却最为直观)
我们先上一个总体流程图

注:上图中绿色线条表示默认的事件处理流程,即我们没有做任何处理,事件会按照绿色线条所示的方向由Activity->...ViewGroup..->View->...ViewGroup..->Activity这个U型图进行传递。即一直默认调用super.XXX方法。
上图中黑色线条表示默认Activity->...ViewGroup..->View->...ViewGroup..->Activity这个U型图的任一节点中(不包括onInterceptTouchEvent)返回了true,事件即结束,不再向下一节点传递。
上图中红色线条表示一些特殊情况,尤其是ViewGroup,ViewGroup.onInterceptTouchEvent表示询问当前ViewGroup是否需要拦截此事件即要不要处理,为什么要“多此一举”呢,因为ViewGroup.dispatchTouchEvent这个函数的特殊,从上图可知,该函数返回true,是消费事件,返回false是交由上一级的ViewGroup或者Activity的onTouchEvent。那么它怎么向下传递事件或者想把事件交给自己的onTouchEvent处理呢ÿ[\]PSOT.`Y]yQ\\9l,y+Y]IY]Y]
IY]\H\\Y[YL[OHOiY]9kdY].y..`9oe[Q\\ PS[H[OH\N[\][\][KZZY[\]PSOT[H[OH\N[\][\][KZZY[\].gi9y"ykdY].yi9.Q\\9..[8d#PSOS_PS[H[OH\N[\][\][KZZY[\]T9.&.yk.". 9iy.+yQ\\:/c9b!c ".[ , -clY]\]][ +l9az`&ab9b)9S\[\/knm, \[\y.yk//9a+ dY]9][9yX#y..[ b&y.ykQ\\:dj:/c9b!c#PSOS_PS9. O[OH\N[\][\][KZZY[\]\]K[N\XK[Nn#9&!z &acy."ghb!8/h9. 9k/&"y-#[OH\N[\][\][KZZY[\]ZY\\]K\[N\XK\[N\\YN\XN\[YN\]\[N\Y\]XMKMKMJN[OH\N[\][\][KZZY[\]\]K[N\XK[N[OH\N[\][\][KZZY[\]."9db9g*9."+y$y.!/c9k&:hny.g$y.cya9kfayn9 z+9ioI[OH\N[\][\][KZZY[\][H[OH\N[\][\][KZZY[\]."oaIi9.:(cO."&!$y.,yiO[OH\N[\][\][KZZY[\]!.bUY]nmay+99ai/ez)9a)`9+*z/Y]d[OH\N[\][\][KZZY[\]ZY\\]K\[N\XK\[N\\YN\XN\[YN\]\[N\Y\]XMKMKMJN[OH\N[\][\][KZZY[\]\]K[N\XK[Ni:!k9X[[OH^X[Y\[Y\H[Y[ZZ[XZZ[[^][KM
KNMXMXMYL[OHKN
Z[\[\YMMMH[H[HY[HZYKN
Z[\[[OH^X[Y\]