1. 程式人生 > >關於View事件分發

關於View事件分發

關於事件分發:
dispatchTouchEvent
//是否消費,不消費就傳遞給上一層
對於view,super是true,走ontouchevent
對於viewgroup,如果是super,走onInterceptTouchEvent去判斷是否進行攔截,如果不是,這個事件的作廢;如果是true,直接消費,不再走下面的分發,如果false,給上一級的onTouchenevnt.


onInterceptTouchEvent
//是否攔截,攔截true就會在當前的onTouch走
不攔截false,就會傳遞到子view,子view去走dispatchEvent
對於super,這個只有viewgroup存在,預設表示不攔截


onTouchEvent
//是否消費,
true表示接收並消費,false表示向上傳遞,直接傳遞給上級的onTouch,如果都返回false,事件消失
對於super,view預設返回true,viewgroup預設返回false


onTouch 
//該事件優先於onTouchEvent,如果onTouch返回true,onTouchEvent就不會執行


重要:


對於Activity、ViewGroup、View所包含的事件


Activity:dispatchTouchEvent(dispatch有分發和處理兩個不同的意思,這裡理解為處理比較好)、onTouchEvent


View:和activity一樣


ViewGroup:在加上一個OnInterceptTouchEvent,這個事件表示攔截,如果dispathch事件返回了super,那麼就會從onInterceptTouchEvent尋找返回值,如果inter返回true,則dispatch也是true,反之相同。這個事件的呼叫只有在dispatch返回super的時候才會用。


對於Ontouch事件,這個事件只有view才有,而且他的優先順序是大於onTouchEvent的


對於三者的優先順序:activity>viewgroup>view


例項:


1.當一個事件觸發,當他首先會到達activity的dispatch事件,如果返回了super,那麼事件就繼續傳遞到下一級即ViewGroup,如果返回的不是super,那麼就表示這個DOWN事件被activity自己處理了,但是並不會觸發onTouchEvent事件,原因待續。


2.activity的dispatch返回了super,那麼事件現在到ViewGroup的dispatch了,如果viewgroup的dispatch返回來了super,那麼就會去找onIntercepter的返回值了;如果不是super,返回true,事件作廢,不會觸發viewgroup的onTouchEvent了,原因待續,如果返回false,表示viewgroup不處理這個事件,就會給上層activity,然後觸發activity的onTouchEvent。


3.到現在ViewGroup的dispatch返回了super,現在需要看onIntercept的返回值了,返回super的話,事件就去view了;如果不返回super:若true,那就是說viewgroup決定消費這個事件了,這個事件就會傳遞到viewgroup的onTouchEvent事件了;若false,表示viewgroup不願意處理這個事件,相當於super,事件到view的dispatch了。


4.現在由於viewgroup不攔截(首先dispatch決定super然後onIntercept決定返回false,這兩個必須同時滿足才能到這裡)這個事件,這個事件繼續到View的dispatch了;如果view的dispatch返回了super,那表示view要處理了;如果返回的不是super:如果是true,事件作廢,不會到view的onTouchEvent,和之前的viewgroup和activity一樣,原因不詳;如果是false,表示這個事件我不管,而且上層的viewgroup也不管,那就直接給activity的onTouchEvent了。


5.現在view的dispatch返回了super,表示我現在要處理這個事件了,那麼就走到onTouch事件了,如果返回了true,事件消失,原因不詳;如果返回了false,事件繼續傳遞,傳遞到了onTouchEvent,如果super,那麼事件就view處理了,如果true,則還是view處理;如果false就傳給activity來處理。


如果攔截了down事件,那麼up事件就也攔截了。


diapath決定這個事件是否需要消費,如果消費,才會有後續的分發和處理;在拿到事件之後,interce方法決定了這個時間是否被攔截,攔截就消費了,不攔截的傳下去。