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