事件传递顺序
我们假设在一个activity中有一个ViewGroup,ViewGroup中有一个TextView。</br>
我们设置不同层级的不同事件拦截方法的返回值,每此触控TextView区域来观察事件的传递情况。监听方法有:
Activity的dispatchTouchEvent和onTouchEvent
ViewGroup的dispatchTouchEvent,onInterceptTouchEvent和onTouchEvent
TextView的dispatchTouchEvent和onTouchEvent
一共7个方法,如果下面展示的打印日志没有出现,说明没有调用
默认事件传递顺序
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ ViewGroup onInterceptTouchEvent: down
↓ TextView dispatchTouchEvent down
↓ TextView onTouchEvent down
↓ ViewGroup onTouchEvent: down
↓ Activity onTouchEvent down
↓ Activity dispatchTouchEvent move
↓ Activity onTouchEvent move
↓ Activity dispatchTouchEvent up
↓ Activity onTouchEvent up
Activity的dispatchTouchEvent中返回true
↓ Activity dispatchTouchEvent down
↓ Activity dispatchTouchEvent move
↓ Activity dispatchTouchEvent up
Activity的dispatchTouchEvent中返回false
↓ Activity dispatchTouchEvent down
↓ Activity dispatchTouchEvent move
↓ Activity dispatchTouchEvent up
ViewGroup dispatchTouchEvent中返回true
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ Activity dispatchTouchEvent move
↓ ViewGroup dispatchTouchEvent: move
↓ Activity dispatchTouchEvent up
↓ ViewGroup dispatchTouchEvent: up
ViewGroup dispatchTouchEvent中返回false
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ Activity onTouchEvent down
↓ Activity dispatchTouchEvent move
↓ Activity onTouchEvent move
↓ Activity dispatchTouchEvent up
↓ Activity onTouchEvent up
ViewGroup onInterceptTouchEvent中返回true
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ ViewGroup onInterceptTouchEvent: down
↓ ViewGroup onTouchEvent: down
↓ Activity onTouchEvent down
↓ Activity dispatchTouchEvent move
↓ Activity onTouchEvent move
↓ Activity dispatchTouchEvent up
↓ Activity onTouchEvent up
ViewGroup onInterceptTouchEvent中返回true 并且 onTouchEvent返回true
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ ViewGroup onInterceptTouchEvent: down
↓ ViewGroup onTouchEvent: down
↓ Activity dispatchTouchEvent move
↓ ViewGroup dispatchTouchEvent: move
↓ ViewGroup onTouchEvent: move
↓ Activity dispatchTouchEvent up
↓ ViewGroup dispatchTouchEvent: up
↓ ViewGroup onTouchEvent: up
ViewGroup onInterceptTouchEvent中返回false
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ ViewGroup onInterceptTouchEvent: down
↓ TextView dispatchTouchEvent down
↓ TextView onTouchEvent down
↓ ViewGroup onTouchEvent: down
↓ Activity onTouchEvent down
↓ Activity dispatchTouchEvent move
↓ Activity onTouchEvent move
↓ Activity dispatchTouchEvent up
↓ Activity onTouchEvent up
TextView dispatchTouchEvent返回true
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ ViewGroup onInterceptTouchEvent: down
↓ TextView dispatchTouchEvent down
↓ Activity dispatchTouchEvent move
↓ ViewGroup dispatchTouchEvent: move
↓ ViewGroup onInterceptTouchEvent: move
↓ TextView dispatchTouchEvent move
↓ Activity dispatchTouchEvent up
↓ ViewGroup dispatchTouchEvent: up
↓ ViewGroup onInterceptTouchEvent: up
↓ TextView dispatchTouchEvent up
TextView dispatchTouchEvent返回false
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ ViewGroup onInterceptTouchEvent: down
↓ TextView dispatchTouchEvent down
↓ ViewGroup onTouchEvent: down
↓ Activity onTouchEvent down
↓ Activity dispatchTouchEvent move
↓ Activity onTouchEvent move
↓ Activity dispatchTouchEvent up
↓ Activity onTouchEvent up
总结
- 先借一张神图来帮助记忆(原图所在博客地址:https://www.jianshu.com/p/e99b5e8bd67b
首先说明,这个统计数据是我根据demo手动修改返回值打印日志所得,过程可能存在疏忽或遗漏,如有错误,还望指正。
Activity的dispatchTouchEvent方法中,不论返回true或false,都表示消费事件,事件不会向下传递。
在默认情况下,ViewGroup的onInterceptTouchEvent方法返回super和返回false效果是一样的
Activity或ViewGroup的onTouchEvent方法不靠谱,很可能被自己或下面View/ViewGroup拦截下来,只有没有任何拦截时,才会调用此方法。
在down事件中,ViewGroup的onInterceptTouchEvent方法返回true,但是onTouchEvent不返回true的话,接下来的move up等事件,将不会再传递进进来,如果onTouchEvent返回true的话,后续事件才会传递进来。