1.首先明白一個常識:View 沒有onInterceptTouchEvent事件,而ViewGroup這三個事件都有,是viewgroup繼承View以後才加了一個方法叫onIntercepTouchEvent。
從字面意思能夠看出,onInterceptTouchEvent是攔截器,用來攔截事件用的,dispatchTouchEvent是用來分發事件的,onTouchEvent是用來處理事件的。
你們不難看出,應該是先走dispatchTouchEvent而後走onTouchEvent。那OnInterceptTouchEven的調用時機是何時呢?爲了更好的理解這三個事件,咱們從簡單到複雜,先從一個子view,一個viewgroup,而後viewgroup裏有子view。
2.針對一個View來說,事件是先走該View的dispatchTouchEvent,而後再走onTouchEvent(也有可能不走)。
何時不會走onTouchEvent呢?當重寫dispatchTouchEvent,不走super.dispatchTouchEvent直接返回false,它就不會走onTouchEvent。
固然這樣作是違反android架構常理的,通常的dispatchTouchEvent是不建議重寫的。不過經過這個案例咱們能夠總結出這麼一個結論.
在事件到達view的時候,先走dispatchTouchEvent,在系統的dispatchTouchEvent中它會調用該view的Ontouch方法若是此onTouch方法的down事件裏返回true,則
dispatchTouchEvent方法也返回true,且把之後的move事件,up事件都傳給onTouch。以後的move事件及up事件的返回值,onTouch返回什麼dispatchTouchEvent也返回什麼。
相反若是傳第一個down事件給ontouch的時候,ontouch返回的是false,今後事件再也不會傳過來,也就是不會走dispatchTouchEvent。更不會走ontouchevent
3.針對一個ViewGroup來說(沒有子view的時候):
事件的走向是dispatchTouchEvent->onInterceptTouchEvent->onTouchEvent
咱們會發現它們的邏輯跟view 的沒什麼兩樣,只是在走down事件的時候onInterceptTouchEvent會在中間,而這裏無論onInterceptTouchEvent返回什麼都不會干擾它像2.形容的那
樣運行,難道onInterceptTouchEvent這個方法沒用?
4.當Viewgroup裏有子view的時候
down事件走向:viewgroup.dispatchTouchEvent->viewgroup.onInterceptTouchEvent ->若是返回true->viewgroup.onTouch-------------------------------分支1
|->若是返回false->view.dispatchTouchEvent分支2
分支1:以後的move或up事件的走向是:viewgroup.dispatchTouchEvent->viewgroup.ontouch 這裏無論ontouch返回的是什麼都是這個走向
分支2:down事件到了view.dispatchTouchEvent->view.onTouch->返回true->分支3
|->返回false->viewgroup.ontouch->返回true->move,up等事件viewgroup.dispatchTouchEvent-
|->返回false,則該viewgroup不會再收到後續事件了
>viewgroup.ontouch
分支3:子view的onTOuch返回true了,表示子view能接受該事件,從此的事件走向是
Move:viewgroup.dispatchTouchEvent->viewgroup.onInterceptTouchEvent返回?
若是返回的是false,之後的move,up都這麼走viewgroup.dispatchTouchEvent->viewgroup.onInterceptTouchEvent->view.dispatchTouchEvent->view.ontouch
若是返回的是true,搶奪子view的move事件接下來的走向是:強制傳Cancel事件和UP事件給view,view.dispatchTouchEvent->view.ontouch(無視它返回什麼)->而後把Move事件留給viewgroup:viewgroup.dispatchTouchEvent->viewgroup.ontouchhtml
這個現象你們應該在listview或是scrollview裏見過,就是當用戶在scrollview裏按住一個按鈕,發現按鈕作了相應反應(按鈕高亮了),但當按住不放拖它時,發現界面在滾動,這就是由於onInterceptTouchEvent搶事件了!
若是有時間我會作一個app來驗證以上的。謝謝你們android
轉至:http://www.eoeandroid.com/thread-262615-1-1.html架構