Android事件分發機制及問題解答

2021-08-16 01:51:31 字數 2722 閱讀 1792

以下分析僅僅是對原始碼的分析,當然,如果是自定義了事件的分發,那麼就需要另外討論了。

正常觸發乙個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...