Android事件分发机制是个难点和重点,结合下各家,写点本身的理解。。java
首先抛出一个小问题,写一个button的点击事件android
再写一个button的touch事件ide
结果:this
若是把ontouch方法返回值改成true,结果:spa
这是为何?你先能够理解为返回true被消费了,不会往下传递了。.net
你触摸到了任何一个控件,就必定会调用该控件的dispatchTouchEvent方法。那当咱们去点击按钮的时候,就会去调用Button类里的dispatchTouchEvent方法,但是你会发现Button类里并无这个方法,那么就到它的父类TextView里去找一找,你会发现TextView里也没有这个方法,那没办法了,只好继续在TextView的父类View里找一找,这个时候你终于在View里找到了这个方法,示意图以下:3d
而后咱们来看一下View中dispatchTouchEvent方法的源码:orm
看这个就明白了:刚才咱们修改的outouch()方法return true,那么就走上面的if语句,被消费了没有执行click方法,若是outouch()ruturn false,那么dispatchTouchEvent()就ruturn onTouchEvent(event),说明了click方法必定在outouchEvent方法里面,点进去看下,果真blog
****************************************************************************************************************************
接下来咱们看一个图递归
注意:
而后总结一下:1.有三层,Activity,ViewGroup,View, 而后呢,分别是dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent,理解为分发,拦截,消费,由于Activity和view在最上和最底层,因此没有onInterceptTouchEvent.
2,接下来认真看下图,有三种返回值,return true,return false, return super,若是只走return super的话那么就是一个U型,整个流程应该是Activity---->ViewGroup--->View 从上往下调用dispatchTouchEvent方法,一直到叶子节点(View)的时候,再由View--->ViewGroup--->Activity从下往上调用onTouchEvent方法。
只要分析dispatchTouchEvent它的四条线路就能够理解这幅图
3.线路1:dispatchTouchEvent和onTouchEvent只要是返回true就是被消费了,没了,不会往下传了
4.线路2:dispatchTouchEvent和onTouchEvent只要是返回false就会回溯给父空间的onTouchEvent处理,相似递归中止开始回溯。
5.dispatchTouchEvent返回super.XXXX()那么就会交给这个ViewGroup的onInterceptTouchEvent 来处理,onInterceptTouchEvent (意思拦截,就是ViewGrouo分发的时候,问一问要不要拦截,若是拦截返回true,若是不拦截返回false,默认return super.onInterceptTouchEvent()就是return false),这里面再分两条路,线路3:到了onInterceptTouchEvent 返回true表示拦截,那么意思说本身要处理,就传给本身的onTouchEvent处理,线路4:onInterceptTouchEvent 默认或者返回false那么就交给子view的dispatchTouchEvent
6.这个时候有人可能会有疑问,子view没有onInterceptTouchEvent ,那么怎么给它的onTouchEvent呢,为了让View能够把事件分发给本身的onTouchEvent,View的dispatchTouchEvent默认实现(super)就是把事件分发给本身的onTouchEvent
*************************************************************************************************************************8