事件的监听机制
//view源码
View.dispatchTouchEvent{
if( ! Listener.onTouch )
this.onTouchEvent
}
view.setOnTouchListener中的onTouch方法每次都会先于view本身的onTouchEvent调用,且有优先消费权
事件的记忆机制
- 含义:
窗口内的某个view消费了事件(onTouchEvent返回true),则后续事件会直接发给此view的onTouchEvent,不会再经过其他view的onTouchEvent - 原理:
路径记忆是用分层记忆实现的。每个viewgroup都是分发的关键节点,其维护- -个TouchTarget链表、记录哪个子view消费该事件。上层只关注其直接子节点。
事件的截获机制
//伪代码
dispatchTouchEvent
if(onInterceptTouchEvent){
return this.onTouchEvent
}else{
return child.onTouchEvent
}
如果截获ACTION_ DOWN事件(返回true),则事件不会再分发给子view。
- 两种情况可截获:
- ACTION_DOWN事件一定可截获
- 非ACTION_DOWN事件,若子类消费了事件,且自身标志位允许截获,则可截获。
事件的分裂机制
- 含义
当某个view消费一次事件(ACTION_DOWN)后,后续点击到其旁系view的多指触摸事件将被分裂为单独的事件(ACTION_DOWN),且其旁系view可消费、记忆此单独事件。 - 注意
Android 3.0以上默认开启此机制,可在主题中配置activity和window关闭此功能。
总结
1.每个view都可以被监听。
2.每个viewgroup负责记忆。
3.直系节点间可截获。
4.旁系节点间可分裂。