事件分發學習總結2

佈局結構

所有事件返回值都爲:return super.TouchEvent(event)

E/ActivityToucEvent: dispatchTouchEvent: 0
E/ParentLayout: dispatchTouchEvent: 0
E/ParentLayout: onInterceptTouchEvent: 0
E/NestedParentLayout: dispatchTouchEvent: 0
E/NestedParentLayout: onInterceptTouchEvent: 0
E/ChildView: dispatchTouchEvent: 0
E/ChildView: onTouchEvent: 0
E/NestedParentLayout: onTouchEvent: 0
E/ParentLayout: onTouchEvent: 0
E/ActivityToucEvent: onTouchEvent: 0
E/ActivityToucEvent: dispatchTouchEvent: 1
E/ActivityToucEvent: onTouchEvent: 1

底層View是具有事件的優先消費權的,onTouchEvent最先被調用

ChildView onTouchEvent返回true

E/ActivityToucEvent: dispatchTouchEvent: 0
E/ParentLayout: dispatchTouchEvent: 0
E/ParentLayout: onInterceptTouchEvent: 0
E/NestedParentLayout: dispatchTouchEvent: 0
E/NestedParentLayout: onInterceptTouchEvent: 0
E/ChildView: dispatchTouchEvent: 0
E/ChildView: onTouchEvent: 0
E/ActivityToucEvent: dispatchTouchEvent: 1
E/ParentLayout: dispatchTouchEvent: 1
E/ParentLayout: onInterceptTouchEvent: 1
E/NestedParentLayout: dispatchTouchEvent: 1
E/NestedParentLayout: onInterceptTouchEvent: 1
E/ChildView: dispatchTouchEvent: 1
E/ChildView: onTouchEvent: 1

跟上面對比發現:

  • 如果View 沒有對 ACTION_DOWN 進行消費,此次點擊的後續事件不會傳遞過來;
  • 如果 View 消費了 ACTION_DOWN ,此次點擊的後續事件會直接給這個 View,這裏的後續事件指的是 ACTION_MOVE 和 ACTION_UP 事件;此時,其父 ViewGroup 的 onIntercept 函數仍會被調用,仍能進行攔截,但它自己的 onIntercept 不會被調用了;

NestedParentLayout onInterceptTouchEvent返回true

E/ActivityToucEvent: dispatchTouchEvent: 0
E/ParentLayout: dispatchTouchEvent: 0
E/ParentLayout: onInterceptTouchEvent: 0
E/NestedParentLayout: dispatchTouchEvent: 0
E/NestedParentLayout: onInterceptTouchEvent: 0
E/NestedParentLayout: onTouchEvent: 0
E/ParentLayout: onTouchEvent: 0
E/ActivityToucEvent: onTouchEvent: 0
E/ActivityToucEvent: dispatchTouchEvent: 1
E/ActivityToucEvent: onTouchEvent: 1

若攔截事件但在onTouchEvent中未消費(返回true),事件還是會通過onTouchEvent 向上傳遞

NestedParentLayout dispatchTouchEvent返回false

E/ActivityToucEvent: dispatchTouchEvent: 0
E/ParentLayout: dispatchTouchEvent: 0
E/ParentLayout: onInterceptTouchEvent: 0
E/NestedParentLayout: dispatchTouchEvent: 0
E/ParentLayout: onTouchEvent: 0
E/ActivityToucEvent: onTouchEvent: 0
E/ActivityToucEvent: dispatchTouchEvent: 1
E/ActivityToucEvent: onTouchEvent: 1

若dispatchTouchEvent返回false,則本層不再向下傳遞,將事件傳遞給上層onTouchEvent

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