Android View的事件體系(二)——分發(fā)響應(yīng)機(jī)制

所謂點(diǎn)擊事件的事件分發(fā),其實(shí)就是對MotionEvent事件的分發(fā)過程,即當(dāng)一個(gè)MotionEvent產(chǎn)生了以后洋腮,系統(tǒng)需要把這個(gè)事件傳遞給一個(gè)具體的View的這個(gè)過程。點(diǎn)擊事件的分發(fā)過程由三個(gè)很重要的方法共同完成:

  • public boolean dispatchTouchEvent( MotionEvent ev )
    如果事件能夠傳遞到當(dāng)前View镀脂,則此方法一定會被調(diào)用。返回結(jié)果受當(dāng)前View的onTouchEvent和下級View的dispatchTouchEvent方法影響忘伞,表示是否消耗當(dāng)前事件狗热。
  • public boolean onInterceptTouchEvent( MotionEvent ev )
    ViewGroup特有的方法钞馁,在dispatchTouchEvent方法中調(diào)用虑省,用來判斷是否攔截某個(gè)事件匿刮,默認(rèn)為false,如需攔截則需要重寫該方法探颈。
  • public boolean onTouchEvent( MotionEvent ev )
    在dispatchTouchEvent方法中調(diào)用熟丸,用來處理點(diǎn)擊事件,返回結(jié)果表示是否消耗當(dāng)前事件伪节。

用偽代碼來表示三者的關(guān)系:

public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean consume = false;
        if (onInterceptTouchEvent(ev)) {
            consume = onTouchEvent(ev);
        } else {
            consume = child.dispatchTouchEvent(ev);
        }

        return consume;
    }

簡單描述一下點(diǎn)擊事件的傳遞過程:
當(dāng)一個(gè)點(diǎn)擊事件產(chǎn)生后光羞,它的的傳遞過程遵循如下吮吸:Activity->Window->頂級View,頂級View一般都是一個(gè)ViewGroup怀大,接收到事件后纱兑,就按照事件分發(fā)機(jī)制去分發(fā)事件。
當(dāng)ViewGroup接收到事件后化借,它的dispatchTouchEvent就會被調(diào)用潜慎,如果這個(gè)ViewGroup的onInterceptTouchEvent方法返回true,則表示它要攔截當(dāng)前事件蓖康,接著事件就會交給這個(gè)ViewGroup處理铐炫,即它的onTouchEvent方法就會被調(diào)用,事件不再往下分發(fā)蒜焊。如果這個(gè)ViewGroup的onInterceptTouchEvent方法返回false倒信,就表示它不攔截當(dāng)前事件,事件就會被傳遞到它的子元素去處理泳梆,如此反復(fù)直到事件被最終處理鳖悠。具體流程如下:

界面示例.png
事件分發(fā)及響應(yīng)流程.png

值得注意的是:

  • View的onTouchEvent默認(rèn)都會消耗事件(返回true),除非它是不可點(diǎn)擊的(clickable和longClickable同時(shí)為false)优妙。View的longClickable屬性默認(rèn)都為false乘综,clickable屬性要分情況,比如Button的clickable默認(rèn)為true鳞溉,TextView的clickable默認(rèn)為false瘾带。
  • View的enable屬性不影響onTouchEvent的默認(rèn)返回值,哪怕一個(gè)View是disable狀態(tài)的熟菲,只要它的clickable或者longClickable有一個(gè)為true看政,即該View是可點(diǎn)擊的,它的onTouchEvent都返回true抄罕。
  • 在一個(gè)點(diǎn)擊鏈里面允蚣,只要ViewGroup不攔截事件,則必然是子View先響應(yīng)呆贿,子View不消耗該事件時(shí)嚷兔,ViewGroup才響應(yīng)森渐。
  • 在同一個(gè)ViewGroup里面,多個(gè)View若是重疊冒晰,且點(diǎn)擊的位置在重疊區(qū)域同衣,則必最外的View必先響應(yīng),該View不消耗該事件時(shí)壶运,下層的View才響應(yīng)耐齐。

結(jié)合郭霖大神的源碼解析,可以更清晰地理解View的分發(fā)響應(yīng)機(jī)制:
Android事件分發(fā)機(jī)制完全解析蒋情,帶你從源碼的角度徹底理解(上)
Android事件分發(fā)機(jī)制完全解析埠况,帶你從源碼的角度徹底理解(下)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市棵癣,隨后出現(xiàn)的幾起案子辕翰,更是在濱河造成了極大的恐慌,老刑警劉巖狈谊,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喜命,死亡現(xiàn)場離奇詭異,居然都是意外死亡的畴,警方通過查閱死者的電腦和手機(jī)渊抄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丧裁,“玉大人护桦,你說我怎么就攤上這事〖褰浚” “怎么了二庵?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缓呛。 經(jīng)常有香客問我催享,道長,這世上最難降的妖魔是什么哟绊? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任因妙,我火速辦了婚禮,結(jié)果婚禮上票髓,老公的妹妹穿的比我還像新娘攀涵。我一直安慰自己,他們只是感情好洽沟,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布以故。 她就那樣靜靜地躺著,像睡著了一般裆操。 火紅的嫁衣襯著肌膚如雪怒详。 梳的紋絲不亂的頭發(fā)上炉媒,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機(jī)與錄音昆烁,去河邊找鬼吊骤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛善玫,可吹牛的內(nèi)容都是我干的水援。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼茅郎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了或渤?” 一聲冷哼從身側(cè)響起系冗,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薪鹦,沒想到半個(gè)月后掌敬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡池磁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年奔害,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片地熄。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡华临,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出端考,到底是詐尸還是另有隱情雅潭,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布却特,位于F島的核電站扶供,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏裂明。R本人自食惡果不足惜椿浓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闽晦。 院中可真熱鬧扳碍,春花似錦、人聲如沸尼荆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捅儒。三九已至液样,卻和暖如春振亮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鞭莽。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工坊秸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人澎怒。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓褒搔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親喷面。 傳聞我的和親對象是個(gè)殘疾皇子星瘾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

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