dispatchTouchEvent,onTouchEvent與onInterceptTouchEvent

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架構

相關文章
相關標籤/搜索