Activity
boolean dispatchTouchEvent(MotionEvent event) : 分发事件
boolean onTouchEvent(MotionEvent event) : 处理事件的回调
View
boolean dispatchTouchEvent(MotionEvent event) : 分发事件
void setOnTouchListener(OnTouchListener l) : 设置事件监听器
boolean onTouchEvent(MotionEvent event) : 处理事件的回调方法
ViewGroup
boolean dispatchTouchEvent(MotionEvent ev) : 分发事件
boolean onInterceptTouchEvent(MotionEvent ev) : 拦截事件的回调方法
void setOnTouchListener(OnTouchListener l) : 设置事件监听器
boolean onTouchEvent(MotionEvent event) : 处理事件的回调方法
大体流程
- 当没有消费事件的时候
- down事件:
Activity.dispatchTouchEvent -> ViewGroup.dispatchTouchEvent -> ViewGroup.onInterceptTouchEvent ->View:dispatchTouchEvent -> View:setOnTouchListener -> View:onTouchEvent -> ViewGroup.setOnTouchListener -> ViewGroup.onTouchEvent -> Activity:onTouchEvent -> - move事件:
Activity.dispatchTouchEvent -> Activity.onTouchEvent -> - up事件:
Activity.dispatchTouchEvent -> Activity.onTouchEvent ->
- down事件:
- 当拦截事件的时候
- down事件:
Activity.dispatchTouchEvent -> ViewGroup.dispatchTouchEvent -> ViewGroup.onInterceptTouchEvent -> ViewGroup.setOnTouchListener -> ViewGroup.onTouchEvent -> - move事件:
Activity:dispatchTouchEvent -> Activity:onTouchEvent -> - up事件:
Activity:dispatchTouchEvent -> Activity:onTouchEvent
- down事件:
总结
- 如果没有事件消费,最终会回到顶级Activity或者ViewGroup的onTouchEvent事件
- 区别是:如果重写了activity的事件分发,则分别会走down->move->up事件
- 如果未重写activity的事件分发,则只会走down事件
- 如果有事件消费
- 如果设置了onClick事件,则表示消费事件,否则表示未消费事件,onClick在最后调用且仅调用一次,且无论是否设置了activity的分发事件,都会走down->move->up事件,其中如果设置的是View的onClick事件,则不会走ViewGroup.setOnTouchListener事件,如果同时设置了view和viewGroup的onClick事件,则只会走view的onClick
- 如果没有设置onClick事件,此时重写setOnTouchListener时,务必return true,否则不响应move和up事件.
- 无论将dispatchTouchEvent 设置为true或false,执行结果都是一样的,如果不设置super.dispatchTouchEvent(ev),事件只会走当前view和父viewdispatchTouchEvent 方法,如果有onInterceptTouchEvent也会走,其余方法均不会走
- 如果设置了onInterceptTouchEvent拦截事件,则会在执行完viewGroup的onTouchEvent 后,继续执行activity的move->dowm,而事件不会再向下分发