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...