事件传递的三个阶段
分发(dispatchTouchEvent)
- 返回
true
表示事件被当前视图消费掉了,不在分发; surper.dispatchTouchEvent
表示继续分发该事件;viewGroup
及其子类时会调用onInterceptTouchEvent
来判断是否拦截该事件
拦截(onInterceptTouchEvent)
- 只存在
viewGroup
及其子类 - 返回
true
表示拦截此事件,不继续分发给子视图,同时调用自身onTouchEvent
消费 - 返回
false
和super.onInterceptTouchEvent
表示不对事件拦截,继续传给子视图
消费(onTouchEvent)
- 返回
true
表示当前视图可以处理对应事件,不向上传递给父视图 - 返回
false
表示该视图不处理该事件,上传给父视图的onTouchEvent进行处理
有事件传递能力的类
Activity 和 View
dispatchTouchEvent
、onTouchEvent
ViewGroup
dispatchTouchEvent
、onInterceptTouchEvent
、onTouchEvent
View的传递事件
- 触摸事件从
dispatchTouchEvent
开始,不人为干预(调用super.XXX
方法),事件按照嵌套从外到里传递,到达最里面的View,由它处理事件,true
能处理;false
不处理,并由外层的onTouchEvent处理 事件向里传递时,返回
ture
内层View不在接收事件View控件先执行
onTouch
,最后执行onClick
,如果onTouch
返回true
,事件就不传递
ViewGroup的传递事件
- 触摸事件Activity -> ViewGroup ->View
- ViewGroup 通过onInterceptTouchEvent事件来拦截,
true
:不会继续传递给子View;false
、super.onInterceptTouchEvent
:事件传递给子View - 子view消费事件后,ViewGroup不在接受