關於View事件分發

2021-08-03 04:53:13 字數 2223 閱讀 2271

關於事件分發:

dispatchtouchevent

//是否消費,不消費就傳遞給上一層

對於view,super是true,走ontouchevent

對於viewgroup,如果是super,走onintercepttouchevent去判斷是否進行攔截;如果是true,直接消費(但是不會觸發ontouchevent,相當於作廢了),不再走下面的分發;如果false,給上一級的ontouchenevnt.

onintercepttouchevent

//是否攔截,攔截true就會在當前的ontouch走

不攔截false,就會傳遞到子view,子view去走dispatchevent

對於super,這個只有viewgroup存在,預設表示不攔截

ontouchevent

//是否消費,

true表示接收並消費,false表示向上傳遞,直接傳遞給上級的ontouchevent;

對於super,view預設返回false,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決定返回super/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,如果true,則還是給view處理;如果false/super就傳給viewgroup的ontouchevent。

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

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

View 事件分發機制

小小總結下 詳細看1 viewgroup繼承自view,新增了onintercepttouchevent函式,view無此函式,故不會攔截 2 首先呼叫的是dispatchtouchevent,在此函式中進行判斷是否呼叫onintercepttouchevent,ontouch,ontoucheve...

View事件分發機制

擷取自 android開發藝術探索 三個重要方法 public boolean dispatchtouchevent motionevent ev 事件分發,return true向子view傳遞,return false傳遞到父view public boolean onintercepttouc...

View的事件分發機制

view事件的分發機制由三個方法共同完成,這三個方法是 public boolean dispatchtouchevent motionevent ev public boolean onintercepttouchevent motionevent ev public boolean ontouc...