所謂點擊事件的事件分發(fā),其實就是對MotionEvent事件的分發(fā)過程。怔匣,即當MotionEvent事件發(fā)生時击胜,將該事件傳遞給一個具體的View亏狰。
而這個傳遞的過程就是分發(fā)過程。主要由三個方法來共同完成偶摔。
dispatchTouchEvent暇唾、onInterceptTouchEvent、onTouchEvent
dispatchTouchEvent
用來進行事件的分發(fā)辰斋,如果事件能夠傳遞到當前的View信不,則一定會回調(diào)該方法,返回的結(jié)果受當前View的OnTouchEvent和下級View的dispatchTouchEvent方法的影響亡呵,表示十分消耗當前的事件抽活。
onInterceptTouchEvent
在上述方法內(nèi)部使用,表示是否攔截事件锰什,如果當前View攔截了事件下硕,則同一事件序列當中,此方法不會被再次調(diào)用汁胆。
onTouchEvent
在ondispatchEvent事件中調(diào)用梭姓,表示對事件的處理,返回結(jié)果表示是否消耗當前事件嫩码,
如果不消耗誉尖,則在同一事件序列中,當前View無法接收到當前事件
上面三個方法之間的關(guān)系可以用下面的代碼來表示
public boolean dispatchTouchEvent(MotionEvent event) {
boolean consume = false;
if(onInterceptTouchEvent(event)) {
consume = onTouchEvent(event)
} else {
consume = child.dispatchTouchEvent(event);
}
return consume;
}
由代碼可知铸题,三者之間的關(guān)系:
當當前ViewGroup攔截了事件铡恕,則由當前的onTouchEvent處理琢感,
如果當前ViewGroup沒有攔截,則調(diào)用子View的dispatchTouchEvent探熔,如此反復(fù)直到事件被處理驹针。