史上最清晰的「Android觸摸事件傳遞機制」圖解,一張圖全懂了!
問題1:觸摸事件是什麼?
答:在Android中,我們把每一個「MotionEvent類」的實例,都當做一個觸摸事件。每一次手指與屏幕的接觸,都會在Android中產生一次觸摸事件。
問題2:觸摸事件有幾種?它們分別是什麼?
答:三種。
- ACTION_DOWN:觸摸事件的開始
- ACTION_MOVE:當移動距離超過TochSlop時,將被視為此類型
- ACTION_UP:觸摸事件的結束
它們三個分別對應著三個用戶行為:手指按下,手指滑動,手指抬起。
問題3:觸摸事件的傳遞是什麼?為什麼要有這個概念?
答:在我們點擊屏幕時,手指按到的控制項有很多。比如下圖所示布局:
當我們點擊View的時候,其實我們也點擊在了ViewGroup身上,並且還點擊在了Activity身上。因為View在ViewGroup中,ViewGroup在Activity中。
那麼此時,假如三個人都可以響應這個點擊事件,系統應該把這個點擊事件派送給誰?是三個都派送?還是只派送給其中的某一個?
假如我們熟知「觸摸事件的傳遞機制」,這個問題就可以輕而易舉的解決了——想派給誰就派給誰!
問題4:觸摸事件傳遞討論的主體是什麼?
答:就是問題3的圖片中的這三個:
- Activity
- ViewGroup
- View
因為任何一個頁面,最終都是由這三個組合構成的。即一個Acticvity,多個ViewGroup,多個View。
問題5:觸摸事件傳遞分幾個階段?它們分別是什麼?
答:分3個階段。它們分別是:
- Dispatch 分發
- Intercept 攔截
- Consume 消費
問題6:什麼叫事件的「消費」?
答:消費就是不再繼續傳遞。很多人會把消費誤認為是「處理」,其實不是。一個「觸摸事件」可以被多個傳遞過程中的方法所「處理」,單最終會被某一個方法「消費」。
問題7:標題說了圖解,圖呢?
答:圖在這裡,為了少壓縮點,我橫過來了給,諸位歪著頭看。
高清大圖,私密下載:
鏈接:http://pan.baidu.com/s/1pKGXUVx 密碼:5d97
問題8:這圖什麼意思?解釋一下?
答:這圖顯示了一個「類型為ACTION_DOWN的觸摸事件」,在我們點擊了下圖中紅色區域後所經歷的事情。
可以看到,觸摸事件傳遞系統是由以下方法構成的:
- dispatchTouchEvent
- onInterceptTouchEvent
- onTouchEvent
- onTouch(用戶自己添加,如果沒添加,則在圖中可視為透明)
- onClick(用戶自己添加,如果沒添加,則在圖中可視為透明)
每個方法,又會有三種結果:
- 返回true
- 返回false
- 啥都不返回,直接調用super
這三種結果,又會導致事件被傳遞到其它不一樣的方法。假如我們沒有人為的修改這些方法的話,它們都是默認的返回super的。
問題9:能不能從此圖中找出一些規律?
答:可以,我總結了以下規律:
(1)消費的規律——返回true
事件可以在dispatchTouchEvent中消費,也可以在onTouchEvent中消費,還可以在onTouch中消費,以及在onClick中消費————在這四個方法中,返回true,就是消費。
(2)觸摸傳遞涉及主體?
觸摸區域中有誰(此處的誰,指Activity、ViewGroup、View),事件傳遞就包含誰。沒被手指點到的,就沒它事兒。
(3)關於onClick與onTouch
- onTouch是通過setOnTouchListener方法人工設置的,不一定有。
- onClick是通過setOnClickListener方法人工設置的,也不一定有。
- 但假如有的話,onTouch永遠會在onTouchEvent之前調用,onClick永遠會在onTouchEvent之後調用。
- onClick只會在ACTION.UP事件發生時被調用
問題10:Activity有沒有onClick和onTouch?
答:沒有
問題11:該圖只說了「ACTION_DOWN」,那「ACTION_MOVE」和「ACTION_UP」呢?
答:一次點擊事件中永遠會包含三個事件:
(1)ACTION.DOWN
(2)ACTION.MOVE
(3)ACTION.UP
其中,MOVE和UP會模仿DOWN的行為。即DOWN在哪裡消費,MOVE和UP就會在哪裡消費。
推薦閱讀:
※Android初學基於Eclipse搭建開發環境遇到的各種問題
※UI的設計與Android規範不符怎麼辦?
※為什麼有很多用安卓的人對蘋果用戶有種莫名的優越感?
※安卓到底能不能解決流暢性問題,應該怎麼解決?
※Android 發布新版的節奏放慢,iOS 卻越來越快,這是為什麼?