事件分發機制異常複雜 不是一次就可徹底理解 在不知前提和條件的情況 更不要談理解 否則都是片面的。
因此 理解複雜事務的第一步就是 理清楚、 前提條件、 前提環境
事件分發包括
三個方向 向上傳 、 當前處理、 向下傳
三種處理 (分發 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======當前處理====
返回 並且返回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事件)