VIEW的分發(fā)機制棋弥!

1诚欠、在ViewGroup中漾岳,事件分為dispatchTouchEvent(事件的分發(fā)),onInterceptTouchEvent(事件的攔截)粉寞,onTouchEvent(事件的處理)尼荆。

2、在View中唧垦,事件分為dispatchTouchEvent(事件的分發(fā))捅儒,onTouchEvent(事件的處理)。

可以簡單理解為振亮,首先調用dispatchTouchEvent巧还,其內部調用onInterceptTouchEvent。?我們一般并不會對dispatchTouchEvent進行修改坊秸,只會對事件進行攔截麸祷。也就是調用onInterceptTouchEvent,修改進返回值妇斤。

part1:我們以上面的圖為例摇锋,當down、move站超、up事件觸發(fā)在MyView時荸恕,整個事件是這樣的:



結合流程圖,不難發(fā)現死相,如果我對事件既不攔截融求,也不消費,當觸發(fā)ACTION_DOWN的時候算撮,事件會經過Activity——MyViewGroupA——MyViewGroupB——MyView一層層的向下進行dispatchTouchEvent(分發(fā))—onInterceptTouchEvent(攔截)調用生宛。當到達最底層MyView后,開始觸發(fā)消費操作肮柜,因為我均不消費陷舅,ACTION_DOWN將由底層一層層向上冒,移交上層處理审洞。當抵達最上層Activity后莱睁,說明下層均不消費,之后觸發(fā)的ACTION_MOVE和ACTION_UP將不再向下層分發(fā)傳遞芒澜,直接交由Activity分發(fā)給自己進行處理仰剿。


part2:我們將MyVIewGroupB的onInterceptTouchEvent返回值改為true,其他均是super痴晦。這意味著僅僅MyViewGroupB進行事件攔截南吮,但均無消費,?當將onInterceptTouchEvent改為true時,會直接調用同層的 onTouchEvent!


當觸發(fā)ACTION_DOWN的時候誊酌,事件依然是從Activity開始一層層向下傳遞部凑,當傳遞到MyViewGroupB時露乏,因為進行了事件攔截,所以執(zhí)行完onInterceptTouchEvent后不再向下傳遞涂邀,而是直接交由MyViewGroupB的onTouchEvent進行消費處理施无。由于我們是只攔截必孤,不消費,所以事件向上傳遞兴想,交由上層處理赡勘,最終回到Activity。之后觸發(fā)的ACTION_MOVE和ACTION_UP也不再向下傳遞毙替,直接交由Activity分發(fā)給自己處理践樱。


part3:我們還是將MyViewGroupB的onInterceptTouchEvent返回super,但是將他的onTouchEvent返回true袱院。這意味著我們不攔截忽洛,但是由MyViewGroupB進行事件處理环肘。



可以看出悔雹,當觸發(fā)ACTION_DOWN的時候,事件的分發(fā)傳遞過程和1的時候一樣寂恬,從Activity開始一層層向下傳遞莱没,最終傳遞到最底層MyView酷鸦,觸發(fā)消費操作牙咏,然后MyView將消費操作移交上層處理妄壶,然后到達MyViewGroupB的onTouchEvent丁寄,并且進行了消費處理泊愧,事件處理到此不在向上移交。當觸發(fā)ACTION_MOVE和ACTION_UP操作時屑埋,事件依然需要由Activity開始向下分發(fā)傳遞痰滋,但是當傳遞到MyViewGroupB后,由于其消費了ACTION_DOWN团搞,事件將不再繼續(xù)向下分發(fā)莺丑,而是直接由MyViewGroupB分發(fā)給自己的onTouchEvent進行繼續(xù)處理墩蔓。事件處理也不再向上移交。

part4:將MyViewGroupB的onInterceptTouchEvent和onTouchEvent的返回值均改為true奸披。這意味著既攔截,又消費轻局。



當觸發(fā)ACTION_DOWN的時候仑扑,依然從Activity開始向下傳遞置鼻,當到達MyViewGroupB的是,因為在onInterceptTouchEvent進行了攔截操作储藐,因此不再繼續(xù)向下分發(fā)傳遞,而是交由MyViewGroupB的onTouchEvent進行處理消費蛛碌。MyViewGroupB的onTouchEvent返回的是true,說明它決定對ACTION_DOWN進行處理蔚携,因此事件也就不再移交上層處理克饶。當觸發(fā)ACTION_MOVE和ACTION_UP的時候彤路,事件還是從Activity開始向下傳遞,當到達MyViewGroupB的時候远豺,由于之前進行了攔截操作,因此躯护,MyViewGroupB直接將事件分發(fā)給自己的onTouchEvent進行處理棺滞,不在向下分發(fā)傳遞矢渊。事件處理也不再向上層移交。

總結:

可以看出矮男,最終是否消費毡鉴,是靠onTouchEvent的返回值確定!?當down事件被某層消費憎瘸,則move陈瘦、up事件會按照先從上到下,再平行從左到右的路徑含潘,進行消費遏弱!?看懂這4part塞弊,整個流程也就比較清晰了。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末饰抒,一起剝皮案震驚了整個濱河市袋坑,隨后出現的幾起案子眯勾,更是在濱河造成了極大的恐慌,老刑警劉巖也颤,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翅娶,死亡現場離奇詭異好唯,居然都是意外死亡,警方通過查閱死者的電腦和手機输吏,發(fā)現死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進店門贯溅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躲查,“玉大人,你說我怎么就攤上這事姐霍。” “怎么了镊折?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵恨胚,是天一觀的道長。 經常有香客問我寒波,道長升熊,這世上最難降的妖魔是什么级野? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮卷中,結果婚禮上蟆豫,老公的妹妹穿的比我還像新娘懒闷。我一直安慰自己,他們只是感情好帮辟,可當我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布由驹。 她就那樣靜靜地躺著昔园,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甥郑。 梳的紋絲不亂的頭發(fā)上澜搅,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天,我揣著相機與錄音癌瘾,去河邊找鬼饵溅。 笑死,一個胖子當著我的面吹牛碧注,可吹牛的內容都是我干的糖赔。 我是一名探鬼主播轩端,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼奋构,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拱层?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤径缅,失蹤者是張志新(化名)和其女友劉穎烙肺,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體氏堤,經...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡鼠锈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年脚祟,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片强饮。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡由桌,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情行您,我是刑警寧澤铭乾,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站娃循,受9級特大地震影響炕檩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜捌斧,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一笛质、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捞蚂,春花似錦妇押、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至夫偶,卻和暖如春索守,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚓峦,地道東北人霍转。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓召夹,卻偏偏與公主長得像纱意,于是被迫代替她去往敵國和親爬虱。 傳聞我的和親對象是個殘疾皇子跑筝,可洞房花燭夜當晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內容