Android 事件分发,分发机制
1. 基礎認知
1.1 事件分發的對象是誰?
答:點擊事件(Touch事件)
- 定義
當用戶觸摸屏幕時(View?或?ViewGroup派生的控件),將產生點擊事件(Touch事件)
Touch事件的相關細節(發生觸摸的位置、時間等)被封裝成MotionEvent對象
- 事件類型(4種)
| MotionEvent.ACTION_DOWN | 按下View(所有事件的開始) |
| MotionEvent.ACTION_UP | 抬起View(與DOWN對應) |
| MotionEvent.ACTION_MOVE | 滑動View |
| MotionEvent.ACTION_CANCEL | 結束事件(非人為原因) |
?
- 特別說明:事件列
從手指接觸屏幕 至 手指離開屏幕,這個過程產生的一系列事件
注:一般情況下,事件列都是以DOWN事件開始、UP事件結束,中間有無數的MOVE事件,如下圖:
1.2?事件分發的順序
即 事件傳遞的順序:Activity?->?ViewGroup?->?View
activity返回true時消費事件,viewGroup不再響應事件。
?
?
示意圖
1.3?事件分發過程由哪些方法協作完成?
答:dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()
activity事件觸發順序:viewGroup->activity
11-29 16:32:42.067 16915-16915/com.administrator.mvpdome E/lgq: Activity=分發===11111111111111
11-29 16:32:42.068 16915-16915/com.administrator.mvpdome E/lgq: viewGroup=分發===ddddddddddddd
11-29 16:32:42.069 16915-16915/com.administrator.mvpdome D/lgq: viewGroup==攔截==iiiiiiiii
11-29 16:32:42.069 16915-16915/com.administrator.mvpdome I/lgq: viewGroup=觸摸===tttttttttttttttt
activity事件觸發順序:view->activity
11-29 16:34:32.027 16915-16915/com.administrator.mvpdome E/lgq: Activity=分發===11111111111111
11-29 16:34:32.028 16915-16915/com.administrator.mvpdome E/lgq: Activity=觸摸===11111111111111
?
ViewGroup事件觸發順序:view->viewGroup
11-29 15:28:45.515 10978-10978/com.administrator.mvpdome E/lgq: dispatchTouchEvent=分發===ddddddddddddd
11-29 15:28:45.515 10978-10978/com.administrator.mvpdome D/lgq: onInterceptTouchEvent==攔截==iiiiiiiii
11-29 15:28:45.516 10978-10978/com.administrator.mvpdome I/lgq: onTouchEvent=觸摸===tttttttttttttttt
ViewGroup事件觸發順序:viewGroup->viewGroup
11-29 15:28:45.515 10978-10978/com.administrator.mvpdome E/lgq: dispatchTouchEvent=分發===ddddddddddddd
11-29 15:28:45.515 10978-10978/com.administrator.mvpdome D/lgq: onInterceptTouchEvent==攔截==iiiiiiiii
1.4 onTouch()和onTouchEvent()的區別
- 該2個方法都是在View.dispatchTouchEvent()中調用
- 但onTouch()優先于onTouchEvent執行;若手動復寫在onTouch()中返回true(即 將事件消費掉),將不會再執行onTouchEvent()
?
ViewGroup的dispatchTouchEvent是真正在執行“分發”工作,而View的dispatchTouchEvent方法,并不執行分發工作,或者說它分發的對象就是自己,決定是否把touch事件交給自己處理,而處理的方法,便是onTouchEvent事件,事實上子View的dispatchTouchEvent方法真正執行的代碼是這樣的
?
ViewGroup的onTouchEvent事件是什么時候處理的呢?當ViewGroup所有的子View都返回false時,onTouchEvent事件便會執行。由于ViewGroup是繼承于View的,它其實也是通過調用View的dispatchTouchEvent方法來執行onTouchEvent事件。
?
在目前的情況看來,似乎只要我們把所有的onTouchEvent都返回false,就能保證所有的子控件都響應本次Touch事件了。但必須要說明的是,這里的Touch事件,只限于Acition_Down事件,即觸摸按下事件,而Aciton_UP和Action_MOVE卻不會執行。事實上,一次完整的Touch事件,應該是由一個Down、一個Up和若干個Move組成的。Down方式通過dispatchTouchEvent分發,分發的目的是為了找到真正需要處理完整Touch請求的View。當某個View或者ViewGroup的onTouchEvent事件返回true時,便表示它是真正要處理這次請求的View,之后的Aciton_UP和Action_MOVE將由它處理。當所有子View的onTouchEvent都返回false時,這次的Touch請求就由根ViewGroup,即Activity自己處理了。
?
總結
以上是生活随笔為你收集整理的Android 事件分发,分发机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目答辩PPT(一)
- 下一篇: 有意思的故事