(四)Android事件分發(fā)機(jī)制 - 總結(jié)篇

Android事件分發(fā)中三個重要方法:

public boolean dispatchTouchEvent(MotionEvent event)

dispatchTouchEvent用來進(jìn)行事件的分發(fā)货抄。如果事件能夠傳遞給當(dāng)前的View焕檬,那么此方法一定會被調(diào)用,返回結(jié)果表示是否分發(fā)當(dāng)前事件箱季。

public boolean onInterceptTouchEvent(MotionEvent ev)

onInterceptTouchEventViewGroup提供的方法赂鲤,返回結(jié)果表示是否攔截當(dāng)前事件(默認(rèn)返回false)噪径,如果當(dāng)前View攔截了某個事件,那么在同一個事件序列當(dāng)中数初,此方法不會被再次調(diào)用找爱,

public boolean onTouchEvent(MotionEvent event)

onTouchEventdispatchTouchEvent方法中被調(diào)用,用來處理點擊事件泡孩,返回結(jié)果表示是否消耗當(dāng)前事件(默認(rèn)返回true)车摄,如果不消耗,則在同一個事件序列中,當(dāng)前View無法再次接受到事件吮播。

三個方法的分布情況:

閱讀Android事件分發(fā)的源代碼(6.0版本)

  • 一個事件序列是指從手指觸摸屏幕開始变屁,到手指離開屏幕結(jié)束,這個過程中產(chǎn)生的一系列事件意狠。同一個事件序列是以ACTION_DOWN事件開始粟关,中間含有數(shù)量不定的ACTION_MOVE事件,最終以ACTION_UP事件結(jié)束环戈;
  • 事件傳遞的順序是:Activity -> Window -> View闷板,即事件總是先傳遞給Activity,然后在傳遞給Window院塞,最后在傳遞給View遮晚,頂級View接收到事件后,就會按照事件分發(fā)機(jī)制去分發(fā)事件拦止;
  • 事件的傳遞過程是由外向內(nèi)的鹏漆,即事件總是由父元素分發(fā)給子元素;
  • 正常情況下创泄,一個事件序列只能被一個View攔截且消耗艺玲。一旦一個View攔截了某次事件,那么同一個事件序列內(nèi)的所有事件都會直接交給它處理鞠抑,因此同一個事件序列中的事件不能分別由兩個View同時處理饭聚,但是通過特殊手段可以做到,比如一個View將本該自己處理的事件通過onTouchEvent強(qiáng)行傳遞給其他View處理搁拙;
  • 某個View一旦開始處理事件秒梳,如果它不消耗ACTION_DOWN事件,那么同一事件序列的其他事情都不會再交給它來處理箕速,并且事件將重新交給它的父容器去處理(調(diào)用父容器的onTouchEvent方法)酪碘;
  • 某個View一旦開始處理事件,如果它消耗ACTION_DOWN事件盐茎,但是不消耗其他類型事件兴垦,那么這個點擊事件會消失,父容器的onTouchEvent方法不會被調(diào)用字柠,當(dāng)前view依然可以收到后續(xù)的事件探越,但是這些事件最后都會傳遞給Activity處理;
  • 點擊事件分發(fā)是到達(dá)頂級View后(一般是ViewGroup)窑业,會首先調(diào)用dispatchTouchEvent方法钦幔,其中它的onInterceptTouchEvent方法如果返回true,則會對事件傳遞進(jìn)行攔截常柄,事件由ViewGroup處理鲤氢;如果onInterceptTouchEvent方法返回false搀擂,則代表不對事件進(jìn)行攔截(默認(rèn)返回false),此時子View中的dispatchTouchEvent方法將被調(diào)用卷玉,到此哥倔,事件已經(jīng)由頂級View傳遞給了下一層的View,接下來的過程是一個遞歸循環(huán)的過程揍庄,和頂級View事件分發(fā)過程是一致的,直到完成整個事件分發(fā)东抹。

事件分發(fā)的具體應(yīng)用示例:

Android不規(guī)則點擊區(qū)域詳解


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚂子,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缭黔,更是在濱河造成了極大的恐慌食茎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馏谨,死亡現(xiàn)場離奇詭異别渔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)惧互,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門哎媚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喊儡,你說我怎么就攤上這事拨与。” “怎么了艾猜?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵买喧,是天一觀的道長。 經(jīng)常有香客問我匆赃,道長淤毛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任算柳,我火速辦了婚禮低淡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瞬项。我一直安慰自己查牌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布滥壕。 她就那樣靜靜地躺著纸颜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绎橘。 梳的紋絲不亂的頭發(fā)上胁孙,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天唠倦,我揣著相機(jī)與錄音,去河邊找鬼涮较。 笑死稠鼻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狂票。 我是一名探鬼主播候齿,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闺属!你這毒婦竟也來了慌盯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤掂器,失蹤者是張志新(化名)和其女友劉穎亚皂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體国瓮,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡灭必,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了乃摹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禁漓。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖孵睬,靈堂內(nèi)的尸體忽然破棺而出璃饱,到底是詐尸還是另有隱情,我是刑警寧澤肪康,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布荚恶,位于F島的核電站,受9級特大地震影響磷支,放射性物質(zhì)發(fā)生泄漏谒撼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一雾狈、第九天 我趴在偏房一處隱蔽的房頂上張望廓潜。 院中可真熱鬧,春花似錦善榛、人聲如沸辩蛋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悼院。三九已至,卻和暖如春咒循,著一層夾襖步出監(jiān)牢的瞬間据途,已是汗流浹背绞愚。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留颖医,地道東北人位衩。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像熔萧,于是被迫代替她去往敵國和親糖驴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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