View的事件分發(fā)機制(上)

在我們使用手機的時候,會與應(yīng)用進行各種交互行為韭畸,每次滑動白魂,點擊都是一種觸摸事件,在Android中有如下一些觸摸事件

  • ACTION_DOWN = 0槽片,手觸摸到屏幕時觸發(fā)
  • ACTION_UP = 1何缓,手按完屏幕,離開屏幕時出發(fā)
  • ACTION_MOVE = 2还栓,手在屏幕上滑動時觸發(fā)
  • ACTION_CANCEL =3碌廓,接收到觸摸事件中任一事件后,其后續(xù)的事件被攔截無法接收剩盒,則觸發(fā)cancel
  • ACTION_OUTSIDE = 4谷婆,手滑到屏幕外或者View之外,一般不由該View進行處理辽聊,而是通過Window.Callback進行回調(diào)

如何分發(fā)觸摸事件

image.png

大致分發(fā)流程
Activity收到事件纪挎,并傳給小弟處理(DecorView也是一個ViewGroup)

Activity -> PhoneWindow -> ViewGroup -> ... -> View

若小弟處理不了,則回傳給Activity

Activity <- PhoneWindow <- ViewGroup <- ... <- View

對于事件跟匆,Android中有三個方法來處理它

  • dispatchTouchEvent() -- 分發(fā)事件异袄,將事件傳遞出去
  • onInterceptTouchEvent() -- 攔截事件,子View或下一層級的就收不到該事件
  • onTouchEvent() -- 處理事件

Activity贾铝,ViewGroup隙轻,View中是否含有上述方法

方法 Activty ViewGroup View
dispatchTouchEvent()
onInterceptTouchEvent() × ×
onTouchEvent()

由上表可見,Activity和View都沒有攔截事件的方法
因為Activiy處于事件分發(fā)的頂端垢揩,若攔截了玖绿,View就無法做出響應(yīng),影響用戶體驗
而View處于最底層叁巨,再攔截事件已經(jīng)沒有意義斑匪,要么就處理掉事件,要么就不做處理

分發(fā)流程的比喻

  • Activity:老板
  • RootView:經(jīng)理
  • ChildView:員工

在方法中進行打印log锋勺,默認調(diào)用父類方法(即返回值均為false)蚀瘸,布局如下

image.png

Tips:操作方式為點擊ChildView,只有Down庶橱,沒有Up的行為贮勃,模擬器上鼠標按住即可

dispatchTouchEvent: ---------ViewActivity--老板:接到活啦
dispatchTouchEvent: ---------RootView-----經(jīng)理:我也接到活啦
onInterceptTouchEvent: -----RootView-----經(jīng)理:偷懶,丟給員工做
dispatchTouchEvent: ---------ChildView----員工:狗經(jīng)理又來壓榨我了苏章,收到任務(wù)
onTouchEvent: -----------------ChildView----員工:發(fā)現(xiàn)做不了寂嘉,告知經(jīng)理
onTouchEvent: -----------------RootView----經(jīng)理:報告老板奏瞬,做不了啊泉孩!
onTouchEvent: -----------------ViewActivity-老板:報告客戶硼端,這活我不做了

ChildView中onTouchEvent為true時,即員工發(fā)現(xiàn)這個活自己能做寓搬,則經(jīng)理和老板就不用處理啦

dispatchTouchEvent: ---------ViewActivity
dispatchTouchEvent: ---------RootView
onInterceptTouchEvent: -----RootView
dispatchTouchEvent: ---------ChildView
onTouchEvent: -----------------ChildView

RootView中onInterceptTouchEvent為true時珍昨,經(jīng)理有B數(shù),知道員工做不了句喷,就不告知員工了镣典,此時員工不需要處理,只要經(jīng)理上報回老板即可

dispatchTouchEvent: -------ViewActivity
dispatchTouchEvent: -------RootView
onInterceptTouchEvent: ---RootView
onTouchEvent: ---------------RootView
onTouchEvent: ---------------ViewActivity

總結(jié)

對于 dispatchTouchEvent

  • Activity
    • ture:事件被消耗脏嚷,不會傳遞給經(jīng)理骆撇,就是不理會客戶的活
    • false:接活瞒御,并傳下去讓下一層處理
  • ViewGroup(RootView)
    • 情況跟Activity類似父叙,要么不做,要么傳給小弟
  • View
    • true:回調(diào)onTouchEvent()
    • false:不回調(diào)

簡而言之就是true時會回調(diào)onTouchEvent()肴裙,false則不回調(diào)

對于 onInterceptTouchEvent
攔截后(返回值為true)趾唱,下一層不會回調(diào)dispatchTouchEvent(),而是自己處理蜻懦,更不會回調(diào)下一層的onTouchEvent()

對于 onTouchEvent
false的話就會告知上層甜癞,讓上層進行處理
而true的話,自己做完后就行宛乃,不必匯報上層

參考(copy)

安卓自定義View進階-事件分發(fā)機制原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悠咱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子征炼,更是在濱河造成了極大的恐慌析既,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谆奥,死亡現(xiàn)場離奇詭異眼坏,居然都是意外死亡,警方通過查閱死者的電腦和手機酸些,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門宰译,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人魄懂,你說我怎么就攤上這事沿侈。” “怎么了市栗?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵缀拭,是天一觀的道長。 經(jīng)常有香客問我,道長智厌,這世上最難降的妖魔是什么诲泌? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮铣鹏,結(jié)果婚禮上敷扫,老公的妹妹穿的比我還像新娘。我一直安慰自己诚卸,他們只是感情好葵第,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著合溺,像睡著了一般卒密。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棠赛,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天哮奇,我揣著相機與錄音,去河邊找鬼睛约。 笑死鼎俘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的辩涝。 我是一名探鬼主播贸伐,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怔揩!你這毒婦竟也來了捉邢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤商膊,失蹤者是張志新(化名)和其女友劉穎伏伐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翘狱,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡秘案,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了潦匈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阱高。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖茬缩,靈堂內(nèi)的尸體忽然破棺而出赤惊,到底是詐尸還是另有隱情,我是刑警寧澤凰锡,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布未舟,位于F島的核電站圈暗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏裕膀。R本人自食惡果不足惜员串,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昼扛。 院中可真熱鬧寸齐,春花似錦、人聲如沸抄谐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛹含。三九已至毅厚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浦箱,已是汗流浹背吸耿。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留憎茂,地道東北人珍语。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像竖幔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子是偷,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

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