1直撤、ViewGroup中 dispatchTouchEvent()方法簡要執(zhí)行邏輯:
if (event == down) {? //如果是down事件
???? mFirstTouchTarget = null;
? ? ?resetTouchState();重置觸摸狀態(tài)
}
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發(fā)送cancel事件
????????mFirstTouchTarget = null; //關(guān)鍵點
? ? ?}
?}
結(jié)論:
1靠抑、如果在down事件攔截展氓,那么down事件和后續(xù)事件都會被viewgroup處理兔综,因為mFirstTouchTarget為null,還沒有被賦值只泼,也就是事件還沒有被子view消費過剖笙;
2、如果在非down事件攔截请唱,本次事件不會被子view處理弥咪,也不會被父viewGroup處理,后續(xù)事件會被viewGroup處理十绑,因為本次事件mFirstTouchTarget不為null聚至。
如果有分析不正確的地方,請大神們指正本橙。