Android Notes(06) - Touch事件分發響應機制

發佈在我的網站,請訪問http://hukai.me/blog/android-notes-06-touch-event-dispatch-process/


1)概述

Android的TouchEvent通常包含三個動作,ACTION_DOWN,ACTION_MOVE與ACTION_UP。發出的順序是DOWN->MOVE->MOVE->…->UP(注意MOVE事件是否能夠被觸發取決於操作手勢裏面是否包含了移動的動作)。

消息分發流程,從上到下,從父到子:Activity->ViewGroup1->ViewGroup1的子ViewGroup2->…->Target View
消息響應流程,從下到上,從子到父:Target View->…->ViewGroup1的子ViewGroup2->ViewGroup1->Activity

  • public boolean dispatchTouchEvent(MotionEvent ev);
    事件分發處理函數,通常會在Activity層根據UI的顯示情況,把事件傳遞給相應的ViewGroup。下面的演示代碼中,爲了方便模擬,會直接return true,解說中稱之爲“丟棄”。(因爲事件實際上沒有傳遞給任何組件,沒有被消費,而且是主動的行爲,故稱之爲丟棄)

  • public boolean onInterceptTouchEvent(MotionEvent ev);
    對分發的事件進行攔截,注意攔截ACION_DOWN與其他ACTION的差異。
    第1種情況:如果ACTION_DOWN的事件沒有被攔截,順利找到了TargetView,那麼後續的MOVE與UP都能夠下發。如果後續的MOVE與UP下發時還有繼續攔截的話,事件只能傳遞到攔截層,並且發出ACTION_CANCEL。
    第2種情況:如果ACITON_DOWN的事件下發時被攔截,導致沒有找到TargetView,那麼後續的MOVE與UP都無法向下派發了,在Activity層就終止了傳遞。

  • public boolean onTouchEvent(MotionEvent ev);
    響應處理函數,如果有設置對應listener的話,這裏還會與onTouch,onClick,onLongClick有關聯。具體執行順序是onTouch()->onTouchEvent()->onClick()->onLongClick()。是否能夠順序執行,取決於每個方法的返回值是true還是false。具體這裏不展開說。

強關注點:dispatch與intercept的差異,ACTION_DOWN與其他ACITON會對尋找target組件帶來差異,而是否尋找到Target組件對整個流程有着重大的的影響。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章