android 事件分發機制 簡要

事件分發機制異常複雜 不是一次就可徹底理解 在不知前提和條件的情況 更不要談理解 否則都是片面的。

因此 理解複雜事務的第一步就是 理清楚、 前提條件、 前提環境

事件分發包括
三個方向  向上傳    、 當前處理、 向下傳
三種處理  (分發  dispatchTouchEvent)、(攔截 onInterceptTouchEvent)、(處理onTouchEvent)
三種 事件 dwon、 move 、up、

還有兩種視圖  view、viewgroup(區別不大)

=======================3*3*3共產生27種邏輯組合=============

View裏,有兩個回調函數 :dispatchTouchEvent\onTouchEvent
ViewGroup裏,有三個回調函數 :dispatchTouchEvent \onInterceptTouchEvent\onTouchEvent
ViewGroup的dispatchTouchEvent方法 纔是真正的發分發 ViewdispatchTouchEvent方法直接調用了onTouchEvent

public boolean dispatchTouchEvent(MotionEvent ev) 開始處理流程 

1   true======當前處理====

      執行   View group調用自己的onTouchEvent()方法處理
      返回  並且返回true,分發結束 <先寫處理方式再寫返回類型>
2 false=====向上走==============
     執行   如果當前 View 獲取的事件直接來自 Activity,則會將事件返回給 Activity 的 onTouchEvent 進行消費;
               如果當前 View 獲取的事件來自外層父控件,則會將事件返回給父 View 的  onTouchEvent 進行消費。
     返回   return false
3===========向下走
      執行父類代碼 super.dispatchTouchEvent(ev),事件會自動的分發給當前 View 的 onInterceptTouchEvent 方法。

                                    1  如果 onInterceptTouchEvent 返回 true
                                       或者返回 super.onInterceptTouchEvent(ev),則表示將事件進行攔截,並將攔截到的事件交由當前 View 的 onTouchEvent 進行處理;;

                                    2  如果 onInterceptTouchEvent 返回 false,則表示將事件放行,當前 View 上的事件會被傳遞到子 View 上,

                                       再由子 View 的 dispatchTouchEvent 來開始這個事件的分發
/****

ViewGroup所有的子View都返回false時,onTouchEvent事件便會執行

目標View的onTouchEvent返回false,則系統將該事件傳遞至上一層View的onTouchEvent處理。
目標View的onTouchEvent返回true,則後續事件可以繼續傳遞給該View的onTouchEvent處理。

---------關於onInterceptTouchEvent攔截方法的 邏輯

攔截了便自己處理 不往下傳
不攔截就一直往下傳 知道目標 view 《被點擊的那個》
不攔截down 只攔截move的話 目標view會收到cancel事件 且僅僅是一次。
只要攔截了dwon後續全部交由攔截者。


目標view 返回false 再一層層往上推 onTouchEvent處理

ViewGroup中的onInterceptTouchEvent處理完ACTION_DOWN事件返回true
後續的ACTION_MOVE、ACTION_UP事件將不再調用該ViewGroup中的onInterceptTouchEvent方法,
直接將這些事件傳遞給該ViewGroup中的onTouchEvent處理。

ViewGroup中的onInterceptTouchEvent處理完ACTION_DOWN事件返回false,
後續的ACTION_MOVE事件同樣先傳遞到onInterceptTouchEvent中
如果onInterceptTouchEvent處理完ACTION_MOVE返回false,則系統還會將ACTION_MOVE事件傳遞到目標View中的onTouchEvent方法中。
如果onInterceptTouchEvent處理完ACTION_MOVE返回true,則系統不會將ACTION_MOVE事件傳遞到目標View中的onTouchEvent方法中,
而是傳遞ACTION_CANCEL事件到目標View的onTouchEvent方法中,只傳遞一次,此後與目標View沒有任何關係(包括最後的ACTION_UP事件)


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