Android TouchEvent Dispatch 再分析

在 Android 中,一次点击完成实际会产生多个事件,比如一个按钮的点击是: TouchDown → TouchUp → 按钮的 onClickListener 回调触发。

Touch Down Event

Touch Down 事件在Parent View 和 View 是否是 clickable 的情况下都会产生和分发。

Touch Down Event

  • TouchEvent 由 Activity 传递到父 ViewGroup,父ViewGroup的 dispatchTouchEvent 中执行事件的分发流程,返回 true 代表事件被消费了,不会再向下走,返回 false 就走 onInterceptTouchEvent 流程。
  • 父 ViewGroup 的 onInterceptTouchEvent的返回值决定是否传递到子 View。

注: ClickListener 在 TouchUp 事件触发之后才会回调

Touch Up Event

情况一

View isClickable
Parent true
Child true

Touch Up  Event

Parent 和 Child 都是 clickable 的:事件传递到 Child View 的onTouchEvent 里会执行 onClickListener.onClick ,然后事件被消费;如果 Child View 的 onTouchEvent 返回了 false,则会执行 Parent 的 onTouchEvent,进而执行 Parent 的 onClick

一次点击事件的日志:

Activity dispatchTouchEvent: action_down
EventLayout dispatchTouchEvent
EventLayout onInterceptTouchEvent
EventButton dispatchTouchEvent: action_down
EventButton onTouchEvent: action_down
----------------Touch Up-------------------
Activity dispatchTouchEvent: action_up
EventLayout dispatchTouchEvent
EventLayout onInterceptTouchEvent
EventButton dispatchTouchEvent: action_up
EventButton onTouchEvent: action_up
EventButton onClick

情况二

View isClickable
Parent false
Child true

执行 Child View 的 onClick 或者 Child View 的 onTouchEvent 返回了 false,执行 Parent 的 onTouchEvent,由于 clickable == false, 就由返回值决定是否将事件传递到外层 Activity。