事件分發分為捕獲階段和冒泡階段,捕獲階段事件由外部接收傳遞給內層view
,冒泡階段事件由事件源的最小view
開始,依次向外傳遞。
android事件傳遞分為分發、攔截和響應,並且在每一層可以得到控制。activity不具有事件攔截,沒有子view
的viewgroup
不具有事件分發和攔截,因為它沒有子view。
ontouch
是android系統事件機制的基礎。其他事件,如onclick
和onlongclick
都是以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_move
及action_up
等事件直接傳給該層,而不管其返回值是false還是true,事件都不會繼續冒泡到外層,事件由此被消費。
多種監聽的執行順序問題:setontouchlistener
是最先執行的; 只有該控制項完整走完action_down
、action_move
及action_up
後,onclick
才可能被執行;onlongclick
只有action_down
被按壓一段時間後才可能被觸發。
函式分析
返回true,表示改事件在本層不再進行分發且已經在事件分發自身中被消費了。至此,事件已經完結。
返回 false,表明事件在本層不再繼續進行分發,並交由上層控制項的ontouchevent
方法進行消費。當然了,如果本層控制項已經是activity
,那麼事件將被系統消費或處理。
返回系統預設的super.dispatchtouchevent(ev)
,事件將分發給本層的事件攔截onintercepttouchevent
方法進行處理
(如果本層控制項是activity
,由於其沒有事件攔截,因此將直接將事件傳遞到子view
,並交給子view
的事件分發進行處理)。
總結:從以上過程中可以看出,dispatchtouchevent
無論返回true還是false,事件都不再進行分發,只有當其返回super.dispatchtouchevent(ev)
,才表明其具有向下層分發的願望,但是是否能夠分發成功,則需要經過事件攔截onintercepttouchevent
的審核。事件是否具有冒泡特是由ontouchevent
的返回值決定的。這兩個方法都是在view
的dispatchtouchevent
中呼叫的,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...