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