Android事件分發(fā)機(jī)制
當(dāng)用戶觸摸屏幕時,系統(tǒng)會對觸摸事件做出相應(yīng)的相應(yīng),這個事件會產(chǎn)生一個MotionEvent,系統(tǒng)根據(jù)一定的規(guī)則將其傳遞給View進(jìn)行處理,這個過程就是事件分發(fā)機(jī)制了。
事件的傳遞分為兩個階段,即捕獲階段和冒泡階段。捕獲階段:事件最先由最外層的View接收,然后依次向內(nèi)層傳遞,直到傳遞到最小的View,捕獲階段完成;冒泡階段:也就是捕獲階段的逆過程,先由最小的View開始向外冒泡,直到將事件傳遞到最外層View。
在捕獲和冒泡的過程中,可以控制事件是否被攔截,是否繼續(xù)分發(fā),還是做出響應(yīng)后消費(fèi)掉,這里是通過三個方法來控制事件的傳遞和消費(fèi)機(jī)制的,系統(tǒng)又根據(jù)方法的返回值來進(jìn)行相應(yīng)的控制:
事件分發(fā)方法:publicbooleandispatchTouchEvent(MotionEventev)
當(dāng)系統(tǒng)監(jiān)聽到事件時,首先由Activity捕獲到,如果該方法中返回true,表示事件將不進(jìn)行分發(fā)了,并且事件自身被消費(fèi)掉了,此時事件分發(fā)過程結(jié)束;如果該方法返回為false,表示事件還是不會向下分發(fā),而是由上層的onTouchEvent方法進(jìn)行消費(fèi);如果該方法返回為 super.dispatchTouchEvent(ev),事件將分發(fā)給本層的事件攔截onInterceptTouchEvent 方法進(jìn)行處理。
事件攔截方法:publicbooleanonInterceptTouchEvent(MotionEventev)
如果該方法返回 true,表示將事件進(jìn)行攔截,并將攔截到的事件交由本層控件的onTouchEvent進(jìn)行處理;如果該方法返回是false或super.onInterceptTouchEvent(ev),則表示不對事件進(jìn)行攔截,并將事件分發(fā)到子View,由子View的dispatchTouchEvent進(jìn)行處理。
事件響應(yīng)方法:public booleanonTouchEvent(MotionEventev)
如果該方法返回true,表示onTouchEvent處理完事件后消費(fèi)了此次事件,此時事件終結(jié),將不會進(jìn)行后續(xù)的冒泡;如果onTouchEvent返回false或super.onTouchEvent(ev),事件在onTouchEvent中處理后繼續(xù)向上層View冒泡,且由上層View的onTouchEvent進(jìn)行處理。