在 Android 中,一次点击完成实际会产生多个事件,比如一个按钮的点击是: TouchDown → TouchUp → 按钮的 onClickListener 回调触发。
Touch Down Event
Touch Down 事件在Parent View 和 View 是否是 clickable 的情况下都会产生和分发。

- TouchEvent 由 Activity 传递到父 ViewGroup,父ViewGroup的
dispatchTouchEvent中执行事件的分发流程,返回true代表事件被消费了,不会再向下走,返回false就走onInterceptTouchEvent流程。 - 父 ViewGroup 的
onInterceptTouchEvent的返回值决定是否传递到子 View。
注: ClickListener 在 TouchUp 事件触发之后才会回调
Touch Up Event
情况一
| View | isClickable |
|---|---|
| Parent | true |
| Child | true |

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。