事件傳遞簡介
一句話說Android事件傳遞機制
- Android中view的事件傳遞是
從外到內
然後再從內到外
傳遞的,如果中間有view消費
了事件,則終止事件傳遞。
從外到內?
- 從外到內說的是事件傳遞的是從最外層的view(事件是ViewGroup)一層層向其內部childView傳遞的。
從內到外?
- 同樣的從內到外說的是事件傳遞的是從最內層的view一層層向其外部parent View傳遞的。
view事件消費?
- view事件消費,一般是指當前view處理了當前事件,一般爲當前view的onTouchEvent返回true。
具體的事件傳遞說明
- Android中view的事件傳遞分爲view的直接子類和ViewGroup的直接子類兩種不情況,其中兩種相同的地方都會涉及到
onTouchEvent()和dispatchTouchEvent()
,而viewGroup還涉及到一個方法onIntercpetTouchEvent()
。由於view的事件傳遞相對簡單,並且ViewGroup的事件傳遞還會涉及到View中的事件傳遞流程(ViewGroup是View的子類,繼承了View的特性),所以我們先說說View中事件的傳遞流程。
View中事件傳遞流程
- 當事件從外層ViewGroup傳遞到View中時,首先調用的是View的
dispatchTouchEvent
方法,然後再調用View的onTouchEvent()
,如果onTouchEvent()
方法返回true,則表示當前View會消費該事件,事件傳遞終止。如果返回false
,則會回到當前View的parent View中並調用它的onTouchEvent()
,如果onTouchEvent()
返回true,則表示當前ViewGroup消費事件,終止事件傳遞,否則繼續向外傳遞,直到傳遞到Activity
的onTouchEvent()
。如下圖所示:
View Group中的事件傳遞流程
- 當事件傳遞到ViewGroup時,首先調用
dispatchTouchEvent()
,在ViewGroup的dispatchTouchEvent()
方法中首先會調用onIntercepteTouchEvent()
判斷是否需要攔截當前事件,返回true
表示當前ViewGroup攔截當前事件,不在向下傳遞,並調用onTouchEvent()
方法,如果onTouchEvent()
返回true表示當前ViewGroup消費當前事件,終止事件傳遞,如果onTouchEvent()
返回false時,則調用當前ViewGroup的parent View的onTouchEvent()
方法,同理如果當前ViewGroup的parent View的onTouchEvent()
方法放回true,則表示該view消費當前事件,並且終止事件傳遞,反之如果當前ViewGroup的parent View的onTouchEvent()
方法放回false,則繼續向上傳遞事件。如下圖所示: