1,事件分發(fā)機(jī)制
- 事件分發(fā):dispatchTouchEvent(),每個(gè)view只要事件能夠到達(dá),就會(huì)觸發(fā)這個(gè)方法,返回結(jié)果受當(dāng)前view的onTouchEvent的返回結(jié)果和下級(jí)View的dispatchTouchEvent的結(jié)果影響,結(jié)果表示是否消耗了當(dāng)前事件。
- 事件攔截:onInterceptTouchEvent():在dispatchTouchEvent的處理中,處理是否攔截當(dāng)前的事件,如果攔截當(dāng)前的事件,就在當(dāng)前view中處理當(dāng)前的事件,結(jié)果表示是否攔截此事件。
- 事件響應(yīng):onTouchEvent():如果當(dāng)前ViewGroup攔截了事件,或分發(fā)到當(dāng)前View中,會(huì)觸發(fā)此事件,結(jié)果表示是否消耗此事件。
- 三者關(guān)系如下:
//偽代碼
public boolean dispatchTouchEvent(MotionEvent ev)
{
boolean consume = false;
if (onInterceptTouchEvent(ev))
{
consume = onTouchEvent(ev);
}
else
{
consume = child.dispatchTouchEvent(ev);
}
return consume;
}
2,事件分發(fā)機(jī)制的一些總結(jié):
某個(gè)View一旦開(kāi)始處理事件,但是沒(méi)有消耗ACTION_DOWN,該事件會(huì)重新交給父級(jí)元素處理。其它事件,則不會(huì)交給父級(jí)元素處理,事件直接結(jié)束。
ViewGroup默認(rèn)不攔截任何事件,View沒(méi)有onInterceptTouchEvent方法,一旦接收到事件,直接觸發(fā)onToucheEvent,且View默認(rèn)不消耗事件,除非它可點(diǎn)擊的。
-
onTouchEvent和onToucheListener,onClickListener,setTouchDelegate之間的關(guān)系:
- onTouchListener自定義了事件處理方法,它的優(yōu)先級(jí)最高,會(huì)先響應(yīng)它的方法。如果沒(méi)有定義,才會(huì)執(zhí)行系統(tǒng)的onTouchEvent的方法
- onClickListener是由多個(gè)onTouchEvent事件組成,所以它的觸發(fā)是最晚的,優(yōu)先級(jí)最低
- setTouchDelegate自定義的View的作用范圍,如果設(shè)置它,會(huì)優(yōu)先響應(yīng)它的onTouchEvent.