Android事件傳遞機制之1
所謂事件傳遞是指在Android利用程序開發中,當有多個View疊加在同1個區域內,如果按下View所在的區域,按下的Down、Move,Up事件將如何進行傳遞的進程。
假定1個ViewGroup里面包括了1個View,當用戶按下View時,ViewGroup和View有哪些方法會觸發呢。
在了了解這些事件傳遞之前,我們先來了解1下幾個方法的概念:
1. dispatchTouchEvent:此方法只有繼承ViewGroup的類才有,是指向childView分發事件的函數,即當手按下了View(或ViewGroup)的位置,都會通過ViewGroup的dispatchTouchEvent事件,也就是它是所有View事件獲得到之前觸發,所有childView的事件都是通過dispatchTouchevent分發的。
2. onInterceptTouchEvent:此方法只有繼承ViewGroup的類才有,在dipatchTouchEvent分發后,就會被onInterceptTouchEvent所捕獲,此方法起到1個攔截事件的作用,
如果此方法return true,則表示不會再繼續處理后續的事件。例如當onInterecptTouchEvent的Down的時候返回了true,則事件將不會繼續傳遞給子View的onTouchEvent了,
而是將事件傳給當前ViewGroup的onTouchEvent進行處理
3.onTouchEvent:: 此方法不論是ViewGroup,還是View都有此都有,由于不論是ViewGroup還是View都是View的子類,所以onTouchEvent是View的函數。
以下舉1個具體的實例來,描寫事件傳遞進程
假定1個LinearLayout里面包括了1個TextView,當用戶點擊TextView中,事件將是如何傳遞的(為了描寫方便,分別使用L1,T1)
1.默許情況下按以下順序傳遞事件
L1的dispatchTouchEvent的Down -> L1的onInterecptTouchEvent的Down ->T1的onTouchEvent的Down,默許情況下都是這個傳遞順序
2.因而我們可以得出以下結論
Up事件不會走Down事件的onTouchEvent傳遞進程,誰處理了OnTouchEvent的Down事件并且返回了true(則事件不再繼續傳遞下去),誰就處理Up事件,所以如果Down事件傳遞到了最頂級的Parentview,而最頂級的Parent view的onTouchEvent返回了false,則程序將丟失Up事件。