事件分發學習總結

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 結束自己的事件等待;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章