郭神的部落格
當我們手指觸控螢幕的時候,事件其實是通過
activity -> viewgroup -> view的流程到達我們觸控事件的view的。
事件分發三個重要方法:
分發、dispatchtouchevent()攔截、onintercepttouchevent()消費、ontouchevent()
接下來就按照activity -> viewgroup -> view 的流程來大致說一下事件分發機制。
當我們手指觸控螢幕時,會觸發乙個action_down的事件,當前activity首先會做出響應,這時會走到activity的dispatchtouchevent()方法內。在這個方法內部的簡單邏輯如下:
呼叫getwindow.superdispatchtouchevent(),如果該方法返回true,表示當前事件已經被處理掉。否則就需要呼叫activity的ontouchevent()方法自己處理
為什麼會走到viewgroup的dispatchtouchevent()?
getwindow()方法返回了乙個window物件,phonewindow是window的唯一實現類,所以相當於呼叫了phonewindow的superdispatchtouchevent().
在phonewindow的方法中呼叫的是的mdecor.superdispatchtouchevent(event)。這個mdecor就是decorview,decorview是framelayout的子類,framelayout是viewgroup的子類,所以本質上呼叫的是viewgroup的dispatchtouchevent().
viewgroup:的dispatchtouchevent()
通過onintercepttouchevent()方法判斷是否攔截,如果攔截則return自己的ontouchevent()。
子view:的dispatchtouchevent()
如果不攔截,呼叫child.dispatchtouchevent(),這裡會呼叫子view的ontouchevent方法,如果子view的ontouchevent方法返回true,則表示事件被處理。
如果未處理,事件會繼續向上傳遞,呼叫父view的ontouchevent方法,直到有view處理該事件,如果一直未處理,最終到達activity的ontouchevent方法終止。
ontouch 和 ontouchevent 的區別
**這兩個方法都在 view 的 dispatchtouchevent()**中
public boolean dispatchtouchevent(motionevent event)
return ontouchevent(event);
}
滿足以上三點,則返回true。
所以ontouch()方法是優先於ontouchevent()方法執行的,如果ontouch()方法返回true,那麼後續操作會被攔截,ontouchevent方法不會被執行,onclick方法在ontouchevent中,所以也不會被執行
Android 事件分發
touch 事件的分發和消費機制dispatchtouchevent onintercepttouchevent 和ontouchevent dispatchtouchevent 事件分發 true 事件會分發給當前view 並由dispatchtouchevent 方法消費,同時停止向下傳 fal...
Android事件分發
android 中與 touch 事件相關的方法包括 dispatchtouchevent motionevent ev onintercepttouchevent motionevent ev ontouchevent motionevent ev 能夠響應這些方法的控制項包括 viewgroup...
Android事件分發
當使用者觸控螢幕時,系統會對觸控事件做出相應的相應,這個事件會產生乙個motionevent,系統根據一定的規則將其傳遞給view進行處理,這個過程就是事件分發機制了。事件的傳遞分為兩個階段,即捕獲階段和冒泡階段。捕獲階段 事件最先由最外層的view接收,然後依次向內層傳遞,直到傳遞到最小的view...