Android事件分發(fā)機制

事件分發(fā)機制.PNG

如上圖所示获三,這是事件ACTION_DOWN的流程圖认轨,而ACTION_MOVEACTION_UP則是根據ACTION_DOWN的消費來定随夸。

  • 如果ViewGroupAView都沒有對ACTION_DOWN事件進行消費旁赊,則ACTION_MOVE的流程就是Activity.dispatch->Activity.onTouch
  • 如果ViewonTouch返回了true拥诡,對ACTION_DOWN進行了消費绷跑,則ACTION_MOVE的流程是Activity.dispath->ViewGroupA.dispatch->ViewGroupA.onIntercept->View.dispatch->View.onTouch

下面分析一下源碼:

activity_dispatchTouchEvent.png
  1. MainActivity繼承Activity且重寫dispatchTouchEvent,不調用super.dispatchTouchEvent,則事件不再繼續(xù).

  2. 當點擊事件觸發(fā),先調用Activity中的dispatchTouchEvent方法,然后調用的getWindow().superDispatchTouchEvent(ev),再看if條件,如果getWindow().superDispatchTouchEvent(ev)返回true,則直接return,如果返回false才走onTouchEvent.

  3. 看看getWindow().superDispatchTouchEvent(ev),這邊直接調用了WindowsuperDispatchTouchEvent,Window是一個虛類,所以該方法在子類中實現,根據Window類上面的注釋The only existing implementation of this abstract class is android.view.PhoneWindow,找到PhoneWindow.

PhoneWindow_superDispatchTouchEvent.png

,再看mDecor,

PhoneWindow_mDecor.png

注釋也得很清楚了,top-level view of the window.并且從代碼中可以知道,DecorView繼承了FragmeLayout,FrameLayout繼承自ViewGroup.

DectorView_superDispatchTouchEvent.png

所以調用了ViewGroupdispatchTouchEvent方法.

  1. 那來看看ViewGroupdispatchTouchEvent方法,一看源碼,好長一段,一步步看吧.
viewgroup_dispatchTouchEvent_1.png

這個標著紅色的,不在ViewGroup里面,因為ViewGroup繼承View,就去View中了下

View_mInputEventConsistencyVerifier.png

看不懂只能看注釋了,注釋還是寫的很清楚的,用于調試的一致性驗證器,這是用于調試的,跟我們沒多大關系,然后接著往下看,

viewgroup_dispatchTouchEvent_2.png

解釋一下這堆代碼,第一個條件ev.isTargetAccessibilityFocus():是否應該被有焦點的控件先處理,第二個條件isAccessibilityFocusedViewOrHost():沒有焦點, 不處理這個事件,結果ev.setTargetAccessibilityFocus(false);:目標View已經處理過了來, 接著用正常邏輯分發(fā),這部分解釋是網絡上抄來的.繼續(xù)看源碼if (onFilterTouchEventForSecurity(ev))這個方法有注釋,是用來過濾事件以應用安全策略.

viewgroup_dispatchTouchEvent_3.png

直接看一下cancelAndClearTouchTargets方法,點擊看注釋Cancels and clears all touch targets.:取消和清除所有觸摸目標,再看resetTouchState方法,繼續(xù)看注釋Resets all touch state in preparation for a new cycle.:重置所有的觸摸狀態(tài)以準備一個新的周期,我的理解,Action_Down作為新一輪事件的開始,就摒棄之前觸摸事件的狀態(tài),重新進入周期.

viewgroup_dispatchTouchEvent_4.png

關于resetTouchState還得講一下,方法里面有一個mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT;后面需要用到.接著往下看

viewgroup_dispatchTouchEvent_5.png

先看if里面的條件,條件一actionMasked == MotionEvent.ACTION_DOWN當為Action_down事件的時候,if成立,此時第二個條件mFirstTouchTarget != null是不成立的,代碼在resetTouchState方法里的clearTouchTargets,就不多解釋了,反過來,第一個條件不成立時,就不會重新清楚狀態(tài),上面講了,只有action_down時,才會清除狀態(tài),所以第一個條件不成立時,第二個條件是成立的.那就是不管咋樣,if都是成立的,那要else干啥,只能看注釋了:沒有觸摸目標拳恋,這個動作不是最初的,因此這個視圖組繼續(xù)攔截觸摸.這就可以理解了.接著看下一個條件final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;上面在clearTouchTargets中提到mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT;,這兩個一看就是0.所以disallowIntercept = flase,下面的if條件成立,進而會調用onInterceptTouchEvent(ev);攔截方法.

接著往下看:

viewgroup_dispatchTouchEvent_6.PNG

在紅線標注的這兩個地方調用了dispatchTransformedTouchEvent

viewgroup_dispatchTouchEvent_7.PNG

從源碼中看出,當該ViewGroupchildView的時候砸捏,就調用super.dispatchTouchEvent,如果還是ViewGroup,則繼續(xù)調用child.dispatchTouchEvent

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末谬运,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子垦藏,更是在濱河造成了極大的恐慌梆暖,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掂骏,死亡現場離奇詭異轰驳,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門级解,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冒黑,“玉大人,你說我怎么就攤上這事勤哗÷盏” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵芒划,是天一觀的道長冬竟。 經常有香客問我,道長腊状,這世上最難降的妖魔是什么诱咏? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮缴挖,結果婚禮上袋狞,老公的妹妹穿的比我還像新娘。我一直安慰自己映屋,他們只是感情好苟鸯,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棚点,像睡著了一般早处。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瘫析,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天砌梆,我揣著相機與錄音,去河邊找鬼贬循。 笑死咸包,一個胖子當著我的面吹牛,可吹牛的內容都是我干的杖虾。 我是一名探鬼主播烂瘫,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奇适!你這毒婦竟也來了坟比?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嚷往,失蹤者是張志新(化名)和其女友劉穎葛账,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體皮仁,經...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡注竿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年茄茁,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巩割。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡裙顽,死狀恐怖,靈堂內的尸體忽然破棺而出宣谈,到底是詐尸還是另有隱情愈犹,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布闻丑,位于F島的核電站漩怎,受9級特大地震影響,放射性物質發(fā)生泄漏嗦嗡。R本人自食惡果不足惜勋锤,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侥祭。 院中可真熱鬧叁执,春花似錦、人聲如沸矮冬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胎署。三九已至吆录,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琼牧,已是汗流浹背恢筝。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巨坊,地道東北人撬槽。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像抱究,于是被迫代替她去往敵國和親恢氯。 傳聞我的和親對象是個殘疾皇子带斑,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容