Android事件傳遞小結

2021-09-23 17:37:30 字數 3559 閱讀 9254

android中的touch事件都封裝在motionevent中,包括action_up, action_down, action_move等,處理touch事件的主要有三個方法

這三個方法的返回值都是boolean型別的。

首先建立三個巢狀的view,由內向外依次為topview(紅色), middleview(綠色)和bottomview(藍色)

android:layout_width=

"300dp"

android:layout_height=

"300dp"

android:background=

"@android:color/holo_blue_bright"

>

android:layout_width=

"200dp"

android:layout_height=

"200dp"

android:background=

"@android:color/holo_green_light"

>

android:layout_width=

"100dp"

android:layout_height=

"100dp"

android:background=

"@android:color/holo_red_light"

/>

然後重寫每個view中的dispatchtouchevent(), ontouchevent()和onintercepttouchevent()這三個方法,用來檢視每個方法被執行的情況。

@override

public

boolean

dispatchtouchevent

(motionevent

event

)@override

public

boolean

ontouchevent

(motionevent

event

)@override

public

boolean

onintercepttouchevent

(motioneventev)

下面三個方法的返回值進行設定,檢視不同效果 (1)預設情況,即三個方法都繼承super的方法,執行後結果為

bottom view->onintercepttouchevent

middle view->onintercepttouchevent

top view->onintercepttouchevent

top view->ontouchevent

middle view->ontouchevent

bottom view->ontouchevent

從結果可以看出touch事件是由外層向內傳遞的,ontouchevent是由內向外執行的。預設情況下不對touch事件進行攔截,也不會對touch事件進行消費。

(2)事件攔截 將middleview的onintercepttouchevent()方法的返回值設為true,其餘預設,即middleview會攔截touch事件,執行結果為

bottom view->onintercepttouchevent

middle view->onintercepttouchevent

middle view->ontouchevent

bottom view->ontouchevent

結果與預想一樣,middleview攔截了touch事件,topview並沒有執行ontouchevent()方法。

(3)事件分發 將middleview的dispatchtouchevent()方法的返回值設為false,即在這一層不進行事件分發,執行結果為

bottom view->onintercepttouchevent

bottom view->ontouchevent

結果說明只在底層進行了touch事件的處理,在上面兩層並沒有獲取這個touch事件。 (3)事件消費 將middleview的ontouchevent()返回值設為ture,對事件進行消費,執行結果為

bottom view->onintercepttouchevent

middle view->onintercepttouchevent

top view->onintercepttouchevent

top view->ontouchevent

middle view->ontouchevent

bottom view->onintercepttouchevent

middle view->ontouchevent

可以看到乙個奇怪的現象,middleview多執行了一次ontouchevent()。將middleview的ontouchevent()方法改寫為

@override

public

boolean

ontouchevent

(motionevent

event

)

這時在執行一次發現輸出的結果為

bottom view->onintercepttouchevent

middle view->onintercepttouchevent

top view->onintercepttouchevent

top view->ontouchevent

motionevent->action_down

middle view->ontouchevent

bottom view->onintercepttouchevent

motionevent->action_up

middle view->ontouchevent

middleview在action_down和action_up兩個動作的時候都執行了一次ontouchevent(),和之前預設情況多了一次執行,在未消費的情況下只監聽到了action_down這個動作,說明如果action_down未消費的話,action_up也不會消費。

(1) touch事件是由父view向子view傳遞的,消費的時候是由子view向父view傳遞的。

(2) 這三個方法執行優先順序為dispatchtouchevent()->onintercepttouchevent()->ontouchevent()。

(3) 父view可以通過onintercepttouchevent()防止事件向後傳遞。

(4) onintercepttouchevent()可以將事件攔截在某一層,事件是可以在這一層被消費的;而dispatchtouchevent()可以組織事件在某一層下發,在這一層無法被消費。

(5) ontouchevent()中的action_down如果沒有被消費,則action_up也不會被消費。

Android事件傳遞機制

android中的事件型別分為按鍵事件和螢幕觸控事件,touch事件是螢幕觸控事件的基礎事件,有必要對它進行深入的了解。乙個最簡單的螢幕觸控動作觸發了一系列touch事件 action down action move action move action move.action move acti...

android的事件傳遞

1 所有 touch 事件都被封裝成了 motionevent 物件,包括 touch 的位置 時間 歷史記錄以及第幾個手指 多指觸控 等。2 事件型別分為 action down,action up,action move,action pointer down,action pointer up...

Android事件傳遞機制

android開發過程中複雜混合控制項的難點之一的就是事件衝突。我們知道在處理事件衝突中,最重要的方法是 dispatchtouchevent onintercepttouchevent ontouchevent 通過作用這三個方法,我們可以達到事件的分發 攔截 消費的效果。在activity 無o...