1、ViewGroup中 dispatchTouchEvent()方法简要执行逻辑:
if (event == down) { //如果是down事件
mFirstTouchTarget = null;
resetTouchState();重置触摸状态
}
intercepted = false;
if(event == down || mFirstTouchTarget != null) {
if(!disallowIntercept) {
intercepted = onInterceptTouchEvent();
} else {
Intercepted =false;
}
} else{
intercepted = true;直接拦截,不询问
}
if(!intercepted){
//子view的简要逻辑
if(child.dispatchTouchEvent()){
mFirstTouchTarget = child;
}
}
if(mFirstTouchTarget == null) {
viewGroup.onTouchEvent(); 交由viewGroup处理
} else {
if (intercepted) {
child.dispatchTouchEvent(cancelEvent); //给子view发送cancel事件
mFirstTouchTarget = null; //关键点
}
}
结论:
1、如果在down事件拦截,那么down事件和后续事件都会被viewgroup处理,因为mFirstTouchTarget为null,还没有被赋值,也就是事件还没有被子view消费过;
2、如果在非down事件拦截,本次事件不会被子view处理,也不会被父viewGroup处理,后续事件会被viewGroup处理,因为本次事件mFirstTouchTarget不为null。
如果有分析不正确的地方,请大神们指正。