Android事件分發(fā)與消費(fèi)機(jī)制

一、Touch 事件分析:

事件分發(fā):dispatchTouchEvent

return true:事件會分發(fā)給當(dāng)前 View 并由 dispatchTouchEvent 方法進(jìn)行消費(fèi),同時(shí)事件停止向下傳遞专执;

return false:返回給 上一級的onTouchEvent 進(jìn)行消費(fèi)少孝;

return super.dispatchTouchEvent(ev):事件會自動的分發(fā)給當(dāng)前 View 的 onInterceptTouchEvent 方法。

事件攔截:onInterceptTouchEvent

(在View 的 dispatchTouchEvent(MotionEvent ev) 返回super.dispatchTouchEvent(ev) 時(shí)陈辱,事件會自動分發(fā)給當(dāng)前 View 的 onInterceptTouchEvent 方法)

return true:將事件進(jìn)行攔截丰滑,并將攔截到的事件交由當(dāng)前 View 的 onTouchEvent 進(jìn)行處理;

return false:將事件放行腺劣,當(dāng)前 View 上的事件會被傳遞到子 View 上绿贞,再由子 View 的 dispatchTouchEvent 來開始這個(gè)事件的分發(fā);

return super.onInterceptTouchEvent(ev):事件默認(rèn)會被攔截橘原,并將攔截到的事件交由當(dāng)前 View 的 onTouchEvent 進(jìn)行處理籍铁。

事件響應(yīng):onTouchEvent

(在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 并且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 時(shí)onTouchEvent 會被調(diào)用)

return? false:事件從當(dāng)前 View 向上傳遞,并且都是由上層 View 的onTouchEvent 來接收趾断,如果傳遞到上面的 onTouchEvent 也返回

false拒名,這個(gè)事件就會“消失”,而且接收不到下一次事件芋酌。

return true:則會接收并消費(fèi)該事件增显。

return super.onTouchEvent(ev): 默認(rèn)處理事件的邏輯和返回 false 時(shí)相同。

全部系統(tǒng)默認(rèn)

1.ViewGroup的dispatchTouchEvent為false:

ViewGroup的dispatchTouchEvent為false

結(jié)果分析:

事件先由Activity的dispatchTouchEvent 分發(fā)給 ViewGroup的dispatchTouchEvent脐帝,而ViewGroup的 dispatchTouchEvent 返回 false同云,表示對獲取到的事件停止向下傳遞,同時(shí)也不對該事件進(jìn)行消費(fèi)堵腹。由于 ViewGroup獲取的事件直接來自 Activity炸站,則會將事件返回給 Activity的 onTouchEvent 進(jìn)行消費(fèi),最后直接由 Activity來響應(yīng)手指移動和抬起事件疚顷。

2.ViewGroup的dispatchTouchEvent為true:

ViewGroup的dispatchTouchEvent為true

結(jié)果分析:

事件由Activity的dispatchTouchEvent 分發(fā)給 ViewGroup的dispatchTouchEvent旱易,而ViewGroup的 dispatchTouchEvent 返回 true,表示分發(fā)事件到ViewGroup并由ViewGroup的dispatchTouchEvent 進(jìn)行消費(fèi)腿堤。Activity 不斷的分發(fā)事件到ViewGroup控件的dispatchTouchEvent阀坏,而ViewGroup控件的dispatchTouchEvent也不斷的將獲取到的事件進(jìn)行消費(fèi)。

3.ViewGroup的onInterceptTouchEvent為true:

ViewGroup的onInterceptTouchEvent為true

結(jié)果分析:

事件由Activity的dispatchTouchEvent方法分發(fā)給ViewGroup控件的dispatchTouchEvent释液,而ViewGroup的 dispatchTouchEvent 返回super.dispatchTouchEvent(ev)全释,表示對事件進(jìn)行分發(fā)并向下傳遞給 ViewGroup控件的onInterceptTouchEvent 方法,該方法返回 true 表示對所獲取到的事件進(jìn)行攔截并將事件傳遞給ViewGroup的onTouchEvent 進(jìn)行處理误债,ViewGroup的 onTouchEvent返回 super.onTouchEvent(ev) 表示對事件沒有做任何處理直接將事件返回給上級浸船,由于 ViewGroup獲取的事件直接來自Activity,所以 ViewGroup的 onTouchEvent會將事件以冒泡方式直接返回給 Activity的 onTouchEvent 進(jìn)行消費(fèi)寝蹈,后續(xù)的事件則會跳過ViewGroup直接由 Activity的 onTouchEvent 消費(fèi)來自Activity自身分發(fā)的事件李命。

4.ViewGroup的onInterceptTouchEvent為false:

ViewGroup的onInterceptTouchEvent為false

結(jié)果分析:

事件先由Activity 的 dispatchTouchEvent 方法分發(fā)給 ViewGroup的 dispatchTouchEvent,而ViewGroup的 dispatchTouchEvent 返回super.dispatchTouchEvent(ev)箫老,表示對事件進(jìn)行分發(fā)并向下傳遞給ViewGroup的 onInterceptTouchEvent 方法封字,該方法返回 false 表示事件會被放行并傳遞到View 的dispatchTouchEvent方法,同樣View的 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev),認(rèn)會將事件傳遞給 View的 onTouchEvent 進(jìn)行處理阔籽,View的 onTouchEvent 返回 super.onTouchEvent(ev)表示對事件沒有做任何處理直接將事件返回給上級流妻,由于 View獲取的事件直接來自ViewGroup,所以View的 onTouchEvent會將事件以冒泡方式直接返回給 ViewGroup
的 onTouchEvent 進(jìn)行消費(fèi)笆制,而 ViewGroup的 onTouchEvent 也返回了super.onTouchEvent(ev)绅这,同樣 ViewGroup的 onTouchEvent 也會將事件返回給上級,而TouchEventFather 獲取的事件直接來自Activity在辆,所以 ViewGroup控件的onTouchEvent 會將事件以冒泡方式直接返回給 Activity 的 onTouchEvent進(jìn)行消費(fèi)证薇,后續(xù)的事件則會跳過 ViewGroup和 View,直接由Activity 的 onTouchEvent 消費(fèi)來自Activity 自身分發(fā)的事件。

5.ViewGroup的onInterceptTouchEvent為false匆篓,View的dispatchTouchEvent為true:

ViewGroup的onInterceptTouchEvent為false浑度,View的dispatchTouchEvent為true

結(jié)果分析:

事件由Activity的dispatchTouchEvent 方法分發(fā)給ViewGroup的dispatchTouchEvent,ViewGroup的 dispatchTouchEvent 返回super.dispatchTouchEvent(ev)鸦概,事件會分發(fā)到ViewGroup的 onInterceptTouchEvent箩张,onInterceptTouchEvent 返回 false,表示放行當(dāng)前事件完残;事件會被傳遞到View 的 dispatchTouchEvent伏钠,dispatchTouchEvent 返回 true 表示事件被分發(fā)到 View并由View的dispatchTouchEvent 方法消費(fèi)横漏。后續(xù)的事件也會不斷的重復(fù)上面的邏輯最終被 View的dispatchTouchEvent 消費(fèi)谨设。






最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缎浇,隨后出現(xiàn)的幾起案子扎拣,更是在濱河造成了極大的恐慌,老刑警劉巖素跺,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件二蓝,死亡現(xiàn)場離奇詭異,居然都是意外死亡指厌,警方通過查閱死者的電腦和手機(jī)刊愚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踩验,“玉大人鸥诽,你說我怎么就攤上這事』叮” “怎么了牡借?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長袭异。 經(jīng)常有香客問我钠龙,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任碴里,我火速辦了婚禮沈矿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咬腋。我一直安慰自己细睡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布帝火。 她就那樣靜靜地躺著溜徙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪犀填。 梳的紋絲不亂的頭發(fā)上蠢壹,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機(jī)與錄音九巡,去河邊找鬼图贸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛冕广,可吹牛的內(nèi)容都是我干的疏日。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撒汉,長吁一口氣:“原來是場噩夢啊……” “哼沟优!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起睬辐,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挠阁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后溯饵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侵俗,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年丰刊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隘谣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啄巧,死狀恐怖寻歧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棵帽,我是刑警寧澤熄求,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站逗概,受9級特大地震影響弟晚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一卿城、第九天 我趴在偏房一處隱蔽的房頂上張望枚钓。 院中可真熱鬧,春花似錦瑟押、人聲如沸搀捷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫩舟。三九已至,卻和暖如春怀偷,著一層夾襖步出監(jiān)牢的瞬間家厌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工椎工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饭于,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓维蒙,卻偏偏與公主長得像掰吕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子颅痊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

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