Android 事件分發(fā)機制

什么是事件?

什么是事件分發(fā)機制祭犯?

在我們通過屏幕與手機交互的時候,每一次點擊滚停、長按沃粗、移動等都是一個個事件。按照面向?qū)ο蟮乃枷爰耄@些一個個事件都被封裝成了MotionEvent最盅。

分發(fā)機制就是某一個事件從屏幕傳遞給app視圖中的各個View,然后由其中的某個View來使用這一事件或者忽略這一事件起惕,這整個過程的控制就是分發(fā)機制了涡贱。

要注意的是,事件分發(fā)機制中惹想,事件是按一個事件序列的形式分發(fā)給View的蔑鹦。這一序列由 ACTION_DOWN 開始卜范,經(jīng)過一系列 ACTION_MOVE 等事件沽瞭,最后以 ACTION_UP 事件結(jié)束爬迟。這一個序列中的所有事件,要么被忽略锋叨,要么就只能有一個事件能使用垄分。要是同一個序列,比如從按下到移動這一系列的動作娃磺,不同的View都能接受的話薄湿,那整個界面就會非常混亂偷卧,而且邏輯很復(fù)雜豺瘤。

Android 事件分發(fā)流


在Android開發(fā)中,事件分發(fā)機制是一塊Android比較重要的知識體系听诸,了解并熟悉整套的分發(fā)機制有助于更好的分析各種點擊滑動失效問題坐求,更好去擴展控件的事件功能和開發(fā)自定義控件,同時事件分發(fā)機制也是Android面試必問考點之一蛇更,如果你能把下面的一些事件分發(fā)圖當場畫出來肯定加分不少瞻赶。

1赛糟、如果事件不被中斷派任,整個事件流向是一個類U型圖

所以如果我們沒有對控件里面的方法進行重寫或更改返回值,而直接用super調(diào)用父類的默認實現(xiàn)璧南,那么整個事件流向應(yīng)該是從Activity---->ViewGroup--->View 從上往下調(diào)用dispatchTouchEvent方法掌逛,一直到葉子節(jié)點(View)的時候,再由View--->ViewGroup--->Activity從下往上調(diào)用onTouchEvent方法司倚。


dispatchTouchEvent 和 onTouchEvent 一旦return true,事件就停止傳遞了(到達終點)(沒有誰能再收到這個事件)豆混÷ㄏ瘢看下圖中只要return true事件就沒再繼續(xù)傳下去了,對于return true我們經(jīng)常說事件被消費了皿伺,消費了的意思就是事件走到這里就是終點员辩,不會往下傳,沒有誰能再收到這個事件了鸵鸥。
dispatchTouchEvent 和 onTouchEvent return false的時候事件都回傳給父控件的onTouchEvent處理奠滑。

看上圖深藍色的線,對于返回false的情況妒穴,事件都是傳給父控件onTouchEvent處理宋税。

對于dispatchTouchEvent 返回 false 的含義應(yīng)該是:事件停止往子View傳遞和分發(fā)同時開始往父控件回溯(父控件的onTouchEvent開始從下往上回傳直到某個onTouchEvent return true),事件分發(fā)機制就像遞歸讼油,return false 的意義就是遞歸停止然后開始回溯杰赛。

對于onTouchEvent return false 就比較簡單了,它就是不消費事件矮台,并讓事件繼續(xù)往父控件的方向從下往上流動乏屯。


dispatchTouchEvent、onTouchEvent瘦赫、onInterceptTouchEvent ViewGroup 和View的這些方法的默認實現(xiàn)就是會讓整個事件安裝U型完整走完瓶珊,所以 return super.xxxxxx() 就會讓事件依照U型的方向的完整走完整個事件流動路徑),中間不做任何改動耸彪,不回溯伞芹、不終止,每個環(huán)節(jié)都走到蝉娜。

分發(fā)事件的組件


分發(fā)的核心方法

負責(zé)對事件進行分發(fā)的方法主要有三個唱较,分別是:

dispatchTouchEvent(

onTouchEvent()

onInterceptTouchEvent()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市召川,隨后出現(xiàn)的幾起案子南缓,更是在濱河造成了極大的恐慌,老刑警劉巖荧呐,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汉形,死亡現(xiàn)場離奇詭異,居然都是意外死亡倍阐,警方通過查閱死者的電腦和手機概疆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峰搪,“玉大人岔冀,你說我怎么就攤上這事「懦埽” “怎么了使套?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵罐呼,是天一觀的道長。 經(jīng)常有香客問我侦高,道長嫉柴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任奉呛,我火速辦了婚禮差凹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侧馅。我一直安慰自己危尿,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布馁痴。 她就那樣靜靜地躺著谊娇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罗晕。 梳的紋絲不亂的頭發(fā)上济欢,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音小渊,去河邊找鬼法褥。 笑死,一個胖子當著我的面吹牛酬屉,可吹牛的內(nèi)容都是我干的半等。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼呐萨,長吁一口氣:“原來是場噩夢啊……” “哼杀饵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谬擦,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤切距,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惨远,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谜悟,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年北秽,在試婚紗的時候發(fā)現(xiàn)自己被綠了葡幸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡羡儿,死狀恐怖礼患,靈堂內(nèi)的尸體忽然破棺而出是钥,到底是詐尸還是另有隱情掠归,我是刑警寧澤缅叠,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站虏冻,受9級特大地震影響肤粱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厨相,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一领曼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛮穿,春花似錦庶骄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至府适,卻和暖如春羔飞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背檐春。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工逻淌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疟暖。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓卡儒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親俐巴。 傳聞我的和親對象是個殘疾皇子朋贬,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355