事件分發機制

2021-09-25 05:32:57 字數 2299 閱讀 5586

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事件,只需要呼叫...