dispatchTouchEvent
return true:表示該View內部消化掉了所有事件
return false:表示事件在本層不再繼續進行分發,並交由上層控件的onTouchEvent方法進行消費
return super.dispatchTouchEvent(ev):默認事件將分發給本層的事件攔截onInterceptTouchEvent方法進行處理(只有返回super.dispatchTouchEvent(ev)纔會觸發onInterceptTouchEvent)
onInterceptTouchEvent
return true:表示將事件進行攔截,並將攔截到的事件交由本層控件的onTouchEvent進行處理
return false:表示不對事件進行攔截,事件得以成功分發到子View
return super.onInterceptTouchEvent(ev):默認表示不攔截該事件,並將事件傳遞給下一層View的dispatchTouchEvent
onTouchEvent
return true:表示onTouchEvent處理完事件後消費了此次事件
return fasle:表示不響應事件,那麼該事件將會不斷向上層View的onTouchEvent方法傳遞,直到某個View的onTouchEvent方法返回true
return super.dispatchTouchEvent(ev):表示不響應事件,結果與return false一樣
Activity-Window-View。從上到下依次傳遞,當然瞭如果你最低的那個view onTouchEvent返回false 那就說明他不想處理 那就再往上拋,都不處理的話
如果某一個子View處理了Down事件,那麼隨之而來的Move和Up事件也會交給它處理。但是交給它處理之前,父View還是可以攔截事件的,如果攔截了事件,那麼子View就會收到一個Cancel事件,並且不會收到後續的Move和Up事件。
傳遞細節描述
- 事件從 Activity.dispatchTouchEvent() 開始傳遞, 依次通過getWindow().superDispatchTouchEvent(event)、mDecor.superDispatchTouchEvent(event) 傳遞,即從Activity-> PhoneWindow ->DecorView, DecorView 是整個 ViewTree 的頂層 ViewGroup ;
- 在整個 ViewGroup 中,事件從頂層開始,依次往子View傳遞;
父 ViewGroup 可以通過 onInterceptTouchEvent() 對事件做攔截,阻止其往下傳遞;
如果未被攔截,則子 View 可以通過 onTouchEvent() 消費(處理)事件; - 如果事件從上往下傳遞過程中一直沒有被攔截,且最底層子 View 沒有消費事件,事件會反向往上傳遞,這時父 ViewGroup 可以在 onTouchEvent() 中消費該事件,如果還是沒有被消費的話,最後會到 Activity 的 onTouchEvent() 函數;
- 底層View是具有事件的優先消費權的;
- 如果View 沒有對 ACTION_DOWN 進行消費,此次點擊的後續事件不會傳遞過來;
- 如果 View 消費了 ACTION_DOWN ,此次點擊的後續事件會直接給這個 View,這裏的後續事件指的是 ACTION_MOVE 和 ACTION_UP 事件;此時,其父 ViewGroup 的 onIntercept 函數仍會被調用,仍能進行攔截,但它自己的 onIntercept 不會被調用了;
- 子 View 可以在 onTouchEvent 中調用 getParent().requestDisallowInterceptTouchEvent(true),這樣父 ViewGroup 的 onIntercept 在後續的事件中就不會被調用了;
- 如果第一個事件即 ACTION_DOWN 就被父 ViewGroup 攔截了,子 View 將不會獲取到消費事件的機會;
- OnTouchListener 優先於 onTouchEvent() 對事件進行消費;
消費指的是相應的函數返回 true ; - ViewGroup 纔有 onIntercept 方法,View 是沒有的,即View不可以攔截事件;
- 所有的事件處理過程都是以 ACTION_DOWN 開始,ACTION_UP 或者 ACTION_CANCEL 結束,ACTION_UP 是事件正常處理邏輯的結束標誌,ACTION_CANCEL 是由父 ViewGroup 主動發出,當父 ViewGroup 攔截了除 ACTION_DOWN 之外的事件,會給正在消費 ACTION_DOWN 並等待後續事件的子 View 發送一個 ACTION_CANCEL 事件,通知子 View 結束自己的事件等待;