在 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。