事件傳遞一共涉及3個(gè)方法:
1.dispatchTouchEvent
2.onInterceptTouchEvent
3.onTouchEvent
首先哥艇,ViewGroup中有這三個(gè)方法,而像TextView或者Button這樣的控件僻澎,不可以再有子控件的View貌踏,是沒有onInterceptTouchEvent方法的十饥。
事件的傳遞像是一個(gè)循環(huán)的過程,由父控件的dispatchTouchEvent祖乳,一直向下傳導(dǎo)(向子控件傳導(dǎo))逗堵,傳導(dǎo)到最后的沒有子控件的View時(shí),就要看子控件是否會消費(fèi)掉這個(gè)事件了眷昆,如果消費(fèi)(onTouchEvent方法)了蜒秤,就沒有父控件什么事了,反之如果沒有消費(fèi)亚斋,這個(gè)事件就會從子控件向上傳導(dǎo)(向父控件傳導(dǎo))作媚,直到父控件有人消費(fèi)(調(diào)用onTouchEvent方法),如果一直沒有父控件消費(fèi)帅刊,最后會由activity消費(fèi)纸泡。
依據(jù)上圖就像一個(gè)由上往下,又由下往上的循環(huán)赖瞒。
值得注意的一點(diǎn)是:上面三個(gè)方法的關(guān)系由一下偽代碼給出:
boolean dispatchTouchEvent(MotionEvent ev){
boolean consume = false;
if(onInterceptTouchEvent()){
consume = onTouchEvent(ev);
}else{
consume = child.dispatchTouchEvent(ev);
}
consume = true;
}