Android事件分發機制

2021-08-31 03:16:56 字數 2052 閱讀 6675

事件分發分為捕獲階段和冒泡階段,捕獲階段事件由外部接收傳遞給內層view,冒泡階段事件由事件源的最小view開始,依次向外傳遞。

android事件傳遞分為分發、攔截和響應,並且在每一層可以得到控制。activity不具有事件攔截,沒有子viewviewgroup不具有事件分發和攔截,因為它沒有子view。

ontouch是android系統事件機制的基礎。其他事件,如onclickonlongclick都是以ontouch為基礎的。ontouch事件過程分為action_down、action_move和action_up等幾個步驟。

監聽ontouch事件的兩種形式:自定義view覆寫ontouchevent(motionevent ev)函式;呼叫待監聽view的setontouchlistener。兩者都是在dispatchtouchevent函式中呼叫,只是通過setontouchlistener方法設定的***會先被呼叫。

action_down是整個事件的起始事件,action_down返回false,表示繼續向外冒泡,action_down返回true,表示該層消費掉了action_down事件,接下來的action_moveaction_up等事件直接傳給該層,而不管其返回值是false還是true,事件都不會繼續冒泡到外層,事件由此被消費。

多種監聽的執行順序問題:setontouchlistener是最先執行的; 只有該控制項完整走完action_downaction_moveaction_up後,onclick才可能被執行;onlongclick只有action_down被按壓一段時間後才可能被觸發。

函式分析

返回true,表示改事件在本層不再進行分發且已經在事件分發自身中被消費了。至此,事件已經完結。

返回 false,表明事件在本層不再繼續進行分發,並交由上層控制項的ontouchevent方法進行消費。當然了,如果本層控制項已經是activity,那麼事件將被系統消費或處理。

返回系統預設的super.dispatchtouchevent(ev),事件將分發給本層的事件攔截onintercepttouchevent方法進行處理

(如果本層控制項是activity,由於其沒有事件攔截,因此將直接將事件傳遞到子view,並交給子view的事件分發進行處理)。

總結:從以上過程中可以看出,dispatchtouchevent無論返回true還是false,事件都不再進行分發,只有當其返回super.dispatchtouchevent(ev),才表明其具有向下層分發的願望,但是是否能夠分發成功,則需要經過事件攔截onintercepttouchevent的審核。事件是否具有冒泡特是由ontouchevent的返回值決定的。這兩個方法都是在viewdispatchtouchevent中呼叫的,ontouch優先於ontouchevent執行。如果在ontouch方法中通過返回true將事件消費掉,ontouchevent將不會再執行。

android事件機制之一:事件傳遞和消費

android事件機制之二:ontouch詳解

android事件分發機制完全解析,帶你從原始碼的角度徹底理解(上)

android事件分發機制完全解析,帶你從原始碼的角度徹底理解(下)

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