史上最清晰的「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個階段。它們分別是:

  1. Dispatch 分發
  2. Intercept 攔截
  3. Consume 消費

問題6:什麼叫事件的「消費」?

答:消費就是不再繼續傳遞。很多人會把消費誤認為是「處理」,其實不是。一個「觸摸事件」可以被多個傳遞過程中的方法所「處理」,單最終會被某一個方法「消費」。

問題7:標題說了圖解,圖呢?

答:圖在這裡,為了少壓縮點,我橫過來了給,諸位歪著頭看。

高清大圖,私密下載:

鏈接:pan.baidu.com/s/1pKGXUV 密碼:5d97

問題8:這圖什麼意思?解釋一下?

答:這圖顯示了一個「類型為ACTION_DOWN的觸摸事件」,在我們點擊了下圖中紅色區域後所經歷的事情。

可以看到,觸摸事件傳遞系統是由以下方法構成的:

  1. dispatchTouchEvent
  2. onInterceptTouchEvent
  3. onTouchEvent
  4. onTouch(用戶自己添加,如果沒添加,則在圖中可視為透明)
  5. onClick(用戶自己添加,如果沒添加,則在圖中可視為透明)

每個方法,又會有三種結果:

  1. 返回true
  2. 返回false
  3. 啥都不返回,直接調用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 卻越來越快,這是為什麼?

TAG:Android開發 | Android | 編程 |