Android View 事件分發(fā)機制流程

想必很多android開發(fā)者都遇到過手勢沖突的情況,我們一般都是通過內(nèi)部攔截和外部攔截法解決此類問題。要想搞明白原理就必須了解View的分發(fā)機制骂际。在此之前我們先來了解一下以下三個非常重要的方法:
ViewGroup中有3個:

      dispatchTouchEvent()
      onInterceptTouchEvent() 
      onTouchEvent() 

View中有2個:

      dispatchTouchEvent()
      onTouchEvent() 

我們分別看看這三個方法:
dispatchTouchEvent()
該方法是用來處理事件的分發(fā)诵叁。如果事件能夠傳遞到當(dāng)前View,那么一定會調(diào)用此方法簿寂。View中該方法的源碼:

QQ圖片20160803160845.png

代碼比較長漾抬,可以簡化來看:

QQ圖片20160803161050.png

從以上可以看出,這三個方法的聯(lián)系常遂。
onInterceptTouchEvent()
該方法在上邊可以看出纳令,是在dispatchTouchEvent中調(diào)用,來判斷自己是否需要截取事件克胳,如果該方法返回為true平绩,那么View將消費該事件,即會調(diào)用onTouchEvent()方法漠另。如果返回false,那么通過調(diào)用子View的dispatchTouchEvent()將事件交由子View來處理馒过。

  onTouchEvent()

和onInterceptTouchEvent()一樣也是在dispatchTouchEvent中調(diào)用的。用來處理點擊事件酗钞,包括ACTION_DOWN,ACTION_MOVE,ACTION_UP腹忽。如果返回結(jié)果為false表示不消費該事件,并且也不會截獲接下來的事件序列砚作。如果返回為true表示當(dāng)前View消費該事件趟庄。
在這里要強調(diào)View 的OnTouchListener昭卓。如果View設(shè)置了該監(jiān)聽,那么OnTouch()將會回調(diào)。 如果返回為true那么該View的OnTouchEvent將不會在執(zhí)行 這是因為設(shè)置的OnTouchListener執(zhí)行時的優(yōu)先級要比onTouchEvent高羽氮。
還有我們平時很熟悉的onClickListener跳座,其優(yōu)先級比上邊兩個都低。

這三個方法在處理View的沖突時經(jīng)常遇到,所以要熟悉其機制摔竿,看完這三個方法,現(xiàn)在來看看事件分發(fā)機制少孝。

為了能夠清楚的分析继低,我們先新建一個項目,布局如圖:

QQ圖片20160803161410.png

ViewGroup1嵌套ViewGroup2,然后在嵌套CustomView(這里我繼承自TextView)稍走。布局很簡單袁翁,只是為了說明ViewGroup的分發(fā)過程。然后在相應(yīng)的View中重寫dispatchTouchEvent婿脸,OnInterceptTouchEvent ,OnTouchEvent方法(CustomView沒有OnInterceptTouchEvent)粱胜,并在每個方法中輸出相應(yīng)的Log:

QQ圖片20160803161739.png

從Log信息可以看出,首先會先執(zhí)行ViewGroup1 dispatchTouchEvent方法狐树,上文中我們講過dispatchTouchEvent()方法的內(nèi)部邏輯:

QQ圖片20160803161050.png

在ViewGroup1 dispatchTouchEvent方法調(diào)用后焙压,接著會調(diào)用onInterceptTouchEvent()來判斷是否需要截取事件,默認(rèn)是不截取的抑钟。事件會傳遞到ViewGroup1的子View也就是ViewGroup2涯曲。即ViewGroup2 的dispatchTouchEvent方法被調(diào)用,直到CustomView味赃。當(dāng)事件傳遞到CustomView后掀抹,同樣是CustomView的dispatchTouchEvent方法會執(zhí)行虐拓⌒乃祝可以看出,整個事件的分發(fā)是從ViewGroup1向CustomView傳遞的蓉驹。此時如果CustomView 不能處理改事件城榛,也就是說CustomView的OnTouchView方法返回為false,那么事件會向上交給ViewGroup2的OnTouchEvent()事件處理态兴,以此類推:

QQ圖片20160803162217.jpg

CustomView的dispatchTouchEvent()沒有執(zhí)行狠持,事件沒有傳遞給CustomView,而是直接調(diào)用了ViewGroup2的ViewGroup2 的onTouchEvent瞻润。

QQ圖片20160803162303.png

我們會發(fā)現(xiàn)ViewGroup2 的OnTouchEvent不會在執(zhí)行了喘垂,還是用我們剛剛的例子來說,就是員工(CustomView)在接到任務(wù)后順利的完成了任務(wù)绍撞,就不必在勞煩上司響應(yīng)處理了正勒。只有在員工(CustomView)無法完成這項工作時(OnTouchEvent返回為false)時才會請求經(jīng)理幫忙(ViewGroup2 調(diào)用OnTouchEvent方法),同樣的傻铣,如果經(jīng)理也不能搞定的話章贞,就交給老板了。如果有興趣的話非洲,可以去研究研究源碼鸭限。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜕径,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子败京,更是在濱河造成了極大的恐慌兜喻,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喧枷,死亡現(xiàn)場離奇詭異虹统,居然都是意外死亡,警方通過查閱死者的電腦和手機隧甚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門车荔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人戚扳,你說我怎么就攤上這事忧便。” “怎么了帽借?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵珠增,是天一觀的道長。 經(jīng)常有香客問我砍艾,道長蒂教,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任脆荷,我火速辦了婚禮凝垛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜓谋。我一直安慰自己梦皮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布桃焕。 她就那樣靜靜地躺著剑肯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪观堂。 梳的紋絲不亂的頭發(fā)上让网,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音师痕,去河邊找鬼溃睹。 笑死,一個胖子當(dāng)著我的面吹牛七兜,可吹牛的內(nèi)容都是我干的丸凭。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惜犀!你這毒婦竟也來了铛碑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤虽界,失蹤者是張志新(化名)和其女友劉穎汽烦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莉御,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡撇吞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了礁叔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牍颈。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖琅关,靈堂內(nèi)的尸體忽然破棺而出煮岁,到底是詐尸還是另有隱情,我是刑警寧澤涣易,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布画机,位于F島的核電站,受9級特大地震影響新症,放射性物質(zhì)發(fā)生泄漏步氏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一徒爹、第九天 我趴在偏房一處隱蔽的房頂上張望荚醒。 院中可真熱鬧,春花似錦瀑焦、人聲如沸腌且。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巫击,卻和暖如春禀晓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坝锰。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工粹懒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顷级。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓凫乖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子帽芽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容