以下分析僅僅是對原始碼的分析,當然,如果是自定義了事件的分發,那麼就需要另外討論了。
正常觸發乙個view的事件流程是什麼?
當觸發螢幕的觸控事件的時候,首先通過activity分發事件,交給phonewindow分發事件,接著交給decorview分發事件,緊接著就呼叫了viewgroup( decorview 父類方法)的分發事件,然後通過dispatchtransformedtouchevent來給子view分發事件,最終交個view的分發事件,然後就是事件的處理了ontouchevent。
activity的分發事件是從**傳遞過來的?
事件分發的觸發條件是什麼?
也就是在觸控按下的時候就進行事件分發了,直到觸控取消或者抬起為乙個事件分發週期
如何攔截activity的觸控事件?
dispatchtouchevent返回true,如果需要處理事件在子檢視中的分發需要super.dispatchtouchevent或者自定義事件分發
原因:在activity的dispatchtouchevent中,ontouchevent的觸發條件是,子檢視的dispatchtouchevent返回false
ontouchevent始終返回true
原因:通過view.dispatchtouchevent可以在得知,如果滿足ontouchevent返回true,那麼就能保證view.dispatchtouchevent可以返回true,這個時候就能達到遮蔽activity的ontouchevent了
dispatchtouchevent的作用?
負責當前view的事件分發操作 例如接下來的事件攔截事件處理,這些都是系統預設寫好的
表明當前view的事件消費狀態
返回值含義:應用層代表事件是否允許交給activity消費
場景:例如乙個檢視a接受觸控事件,預設情況下,activity也是可以收到事件的,如果不想讓activity也接收到事件,那麼就將這個值設定為true
onintercepttouchevent的作用?
其返回值決定了是否攔截事件向子檢視的分發,也就是觸發子檢視的事件分發方法
true:代表不想下分發,自己處理事件 例如:當觸發螢幕某個位置時候,不像讓當前位置的子檢視接收到事件
false:代表向下分發,自己不接受事件
ontouchevent的作用?
處理觸控事件的響應方式 例如:操作檢視平移 縮放等一系列操作
ontouchevent的返回值有什麼作用?
決定了view.dispatchtouchevent的返回值狀態,也間接影響了事件的最終消費物件
requestdisallowintercepttouchevent的作用?
決定onintercepttouchevent是否執行 引數:true執行 false不執行
為什麼重寫子檢視的super.ontouchevent(event)/ 返回false的時候,在移動時候父檢視的onintercepttouchevent就不會執行?
super.ontouchevent(event)預設情況下返回的本身就是false
首先:滿足onintercepttouchevent執行的條件是按下事件 第一次觸控目標mfirsttouchtarget不為空 允許攔截事件標識,
其次:第乙個條件是不滿足的排除,而第二個不為空的觸發是addtouchtarget,因為ontouchevent返回了false,經過一系列的傳遞dispatchtransformedtouchevent也返回了false,這個時候就不能觸發addtouchtarget也就是說mfirsttouchtarget =null,所以就不能執行了onintercepttouchevent
,預設情況下disallowintercept = false。
預設情況下:如何實現父類不攔截,讓子類處理ontouchevent?
首先:讓子檢視的ontouchevent返回true,但是這種情況下父檢視的
onintercepttouchevent會執行一次,如果這裡沒有方法其實也沒什麼,如果也做了處理,那麼就還需要再次處理,根據問題9可以知道以下解決方案。
其次:通過down的時候通過parent.requestdisallowintercepttouchevent(true)在抬起或者取消的時候parent.
requestdisallowintercepttouchevent(false)
另一種方法:在dispatchtouchevent中super.dispatchtouchevent之後進按下時候行parent.
requestdisallowintercepttouchevent(true)就可以達到父類不攔截事件
為什麼重寫dispatchtouchevent直接返回true/false都不能分發事件?
事件分發的目的是為了交給指定的view通過ontouchevent進行事件消費處理。而如果直接返回true/false,其過程並沒有對onintercepttouchevent和ontouchevent進行處理,所以也就不能進行事件分發處理了。
而返回值的意義是 :獲取當前view的事件消費狀態 最終決定activity是否消費事件 比如都不消費就交給activity的ontouchevent是否處理
為什麼要在super.
dispatchtouchevent之後進行請求父類是否攔截?
因為:在super.
dispatchtouchevent中,每次的down事件都會重新將攔截事件標識改為攔截事件,因此在這個方法之後的down重新設定為不攔截,那麼之後的move等事件就能達到不攔截的目的
Android事件分發機制
public boolean dispatchtouchevent motionevent ev else return consume 上面的一段 將事件分發中三個主要方法的關係表現。一 touch 事件分析 事件分發 public boolean dispatchtouchevent motio...
Android事件分發機制
花了一下午的事件研究了一下android的事件分發機制,覺得有必要總結一下 順便分享出來,希望對大家有用 1 首先最重要的是需要了解viewgroup裡面重寫的三個方法 1 dispatchtouchevent 用於事件的分發 2 onintercepttouchevent用於事件的攔截 3 ont...
Android事件分發機制
一 三個重要的方法 dispatchtouchevent onintercepttouchevent activity和view無此方法 activity 作為事件的原始分發著會造成無響應 view最為事件的最末端要麼處理事件,要麼回傳事件 ontouchevent 二 事件分發流程 activit...