1、public boolean dispatchtouchevent(motionevent ev) ————事件分發方法,分發event所呼叫
2、public boolean onintercepttouchevent(motionevent ev) ————事件攔截方法,攔截event所呼叫
3、public boolean ontouchevent(motionevent event) ————事件響應方法,處理event所呼叫
1、activity類(activity及其各種繼承子類)
dispatchtouchevent()、ontouchevent()
2、viewgroup類(linearlayout、framelayout、listview等…)
dispatchtouchevent()、onintercepttouchevent()、ontouchevent()
3、view類(button、textview等…)
dispatchtouchevent()、ontouchevent()
ps:需要特別注意一點就是viewgroup中額外擁有onintercepttouchevent()方法,其他兩個方法為這三種類所共同擁有
我們可以發現這三個方法的返回值都為boolean型別,其實它們就是通過返回值來決定下一步的傳遞處理方向。
1、dispatchtouchevent() ——用來分發事件所用
該方法會將根元素的事件自上而下依次分發到內層子元素中,直到被終止或者到達最裡層元素,該方法也是採用一種隧道方式來分發。在其中會呼叫onintercepttouchevent()和ontouchevent(),一般不會去重寫。
返回false則不攔截繼續往下分發,如果返回true則攔截住該事件不在向下層元素分發,在dispatchtouchevent()方法中預設返回false。
2、onintercepttouchevent() ——用來攔截事件所用
該方法在viewgroup源**中實現就是返回false不攔截事件,touch事件就會往下傳遞給其子view。
如果我們重寫該方法並且將其返回true,該事件將會被攔截,並且被當前viewgroup處理,呼叫該類的ontouchevent()方法。
3、ontouchevent() ——用來處理事件
返回true則表示該view能處理該事件,事件將終止向上傳遞(傳遞給其父view)
返回false表示不能處理,則把事件傳遞給其父view的ontouchevent()方法來處理
1、很明顯,這些流程就是dispatchtouchevent()的處理結果,但是前提是我們不去完全的重新實現這個方法,也就是保證需要return super.dispatchtouchevent(ev);來確定父類的方法有被呼叫。而這些事件將會由上而下的逐層傳遞,直到傳遞到最底層的view元素,此時將會呼叫該view的ontouchevent()方法來處理該事件;返回true來表示對該事件已經成功處理,如果返回false則並沒有成功處理事件,將會把事件逐層向上傳遞,交給上層view的ontouchevent()方法處理,以此類推,直至某一view成功處理該事件,或者到頂層view處理仍然返回false則放棄對該事件處理,事件消失。
2、如果在事件向下傳遞的過程中,被中途攔截,也就是view的onintercepttouchevent()方法返回true,那麼該事件將停止向下傳遞,並交給該層的ontouchevent()方法處理,無論處理成功與否,底層view將再也不會接收到該事件。ps:若處理失敗,則會交由上層view的ontouchevent()方法處理。
3、dispatchtouchevent()具有記憶的功能,如果第一次事件向下傳遞到某view,它把事件繼續傳遞交給它的子view,它會記錄該事件是否被它下面的view給處理成功了,(怎麼能知道呢?如果該事件會再次被向上傳遞到我這裡來由我的ontouchevent()來處理,那就說明下面的view都沒能成功處理該事件);當第二次事件向下傳遞到該view,該view的dispatchtouchevent()方法機會判斷,若上次的事件由下面的view成功處理了,那麼這次的事件就繼續交給下面的來處理,若上次的事件沒有被下面的處理成功,那麼這次的事件就不會向下傳遞了,該view直接呼叫自己的ontouchevent()方法來處理該事件。
4、記憶功能的資訊只在一系列事件完成之前有效,如從action_down事件開始,直到後續事件action_move,action_up結束後,「記憶」的資訊就會清除。也就是說如果某view處理action_down事件失敗了(ontouchevent()返回false),那麼後續的action_move,action_up等事件就不會再傳遞到該view了,由其父view自己來處理。在下一次發生action_down事件的時候,還是會傳遞到該view的。
事件分發機制
android中的事件型別分為按鍵事件和螢幕觸控事件,touch事件是螢幕觸控事件的基礎事件,有必要對它進行深入的了解。乙個最簡單的螢幕觸控動作觸發了一系列touch事件 action down action move action move action move.action move acti...
事件分發機制
對於安卓事件傳遞和消費機制,他給我們提供了3個方法,dispatchtouchevent onintercepttouchevent 和ontouchevent 當監聽到事件時,首先由activity捕獲 開始進入事件分發流程.dispatchtouchevent 如果返回的是true,表明事件不會...
事件分發機制
view的事件分發 對於事件分發機制,舉個簡單的例子,在乙個activity中只有乙個按鈕,如果我們想給這個按鈕註冊乙個點選事件,只需要呼叫setonclicklistener方法,這樣在onclick方法裡面寫實現的 就可以在按鈕被點選的時候執行.我們再給這個按鈕新增乙個touch事件,只需要呼叫...