1208-View:事件分發(fā)機制一

<br />
一個簡單問題:點擊Activity中的一個TextView山涡,觸摸事件是怎樣分發(fā)傳遞的

View的事件傳遞由三個重要方法完成,dispatchTouchEvent(), onInterceptTouchEvent() 和 onTouchEvent()箍土。

public boolean dispatchTouchEvent(MotionEvent event)

用來進行事件的分發(fā)。如果事件能夠傳遞給當前的View罐监,那么此方法一定會被調(diào)用吴藻,返回結(jié)果受當前View的onTouchEvent和下級的dispatchTouchEvent方法的影響,表示是否消耗當前事件弓柱。
<br />
public boolean onInterceptTouchEvent(MotionEvent event)

在dispatchTouchEvent方法內(nèi)部調(diào)用沟堡,用來判斷是否攔截某一事件侧但,返回結(jié)果表示是否攔截。如果當前View攔截了某個事件航罗,那么在同一個事件序列當中禀横,此方法不會被再次調(diào)用。
<br />
public boolean onTouchEvent(MotionEvent event)

在dispatchTouchEvent方法內(nèi)部調(diào)用粥血,用來處理點擊事件柏锄。返回結(jié)果表示是否消耗當前事件,如果不消耗复亏,則在同一個事件序列中趾娃,當前View無法再次接收到事件。
<br />

上述三個方法到底是什么關(guān)系呢缔御?它們的關(guān)系可以用如下偽代碼表示

public boolean dispatchTouchEvent(TouchEvent event) {
    if (onInterceptTouchEvent(event)) {
        consume = onTouchEvent(event);
    } else {
        consume = child.dispatchTouchEvent(event);
    }
    return consume;
}

<br />

同一個事件序列是指從手指接觸屏幕的那一刻起抬闷,到手指離開屏幕的那一刻結(jié)束,在這個過程中所產(chǎn)生的一系列事件耕突。

這個事件序列以down事件開始笤成,中間含有數(shù)量不定的move事件,最終以up事件結(jié)束眷茁。

<br />

事件的傳遞規(guī)則

  • 對于一個根ViewGroup來說炕泳,點擊事件產(chǎn)生后,首先會傳遞給它蔼卡,它的dispatchTouchEvent就會被調(diào)用
  • 如果這個ViewGroup的onInterceptTouchEvent返回true喊崖,就表示它要攔截當前事件,接下來事件會交給這個ViewGroup處理雇逞,即它的onTouchEvent會調(diào)用
  • 如果這個ViewGroup的onInterceptTouchEvent返回false荤懂,則表示它不攔截當前事件,這樣事件會傳遞給子控件塘砸,子控件的dispatchTouchEvent會被調(diào)用节仿,如此反復(fù)直到事件被處理

<br />

事件的傳遞順序

  • 一個點擊事件產(chǎn)生后,它的傳遞過程遵循如下順序:Activity -> Window -> View
  • 一個事件總是先傳遞給Activity掉蔬,Activity再傳遞給Window廊宪,最后Window再傳遞給頂級View,頂級View接收事件后女轿,就會按照事件分發(fā)機制來分發(fā)事件箭启。

<br />

事件的處理過程

  • 由事件的分發(fā)過程可知,事件一般會層層傳遞給最終的View蛉迹,如一個Button或者EditText傅寡,由它的onTouchEvent處理
  • 子View的onTouchEvent的返回值是true還是false,表示它是否處理這個事件
  • View的onTouchEvent默認都會消耗事件,除非它是不可點擊的荐操,比如TextView芜抒,它的onTouchEvent默認返回false
  • 如果子View的onTouchEvent返回false,它不處理事件的話托启,那么它的父容器的onTouchEvent會被調(diào)用宅倒,這個事件會拋給父容器處理,以此類推屯耸。
  • 如果所有元素都不處理這個事件拐迁,那么這個事件最終會傳遞給Activity處理,即Activity的onTouchEvent會被調(diào)用疗绣。

<br />

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唠亚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子持痰,更是在濱河造成了極大的恐慌,老刑警劉巖祟蚀,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件工窍,死亡現(xiàn)場離奇詭異,居然都是意外死亡前酿,警方通過查閱死者的電腦和手機患雏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罢维,“玉大人淹仑,你說我怎么就攤上這事》畏酰” “怎么了匀借?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長平窘。 經(jīng)常有香客問我吓肋,道長,這世上最難降的妖魔是什么瑰艘? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任是鬼,我火速辦了婚禮,結(jié)果婚禮上紫新,老公的妹妹穿的比我還像新娘均蜜。我一直安慰自己,他們只是感情好芒率,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布囤耳。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪紫皇。 梳的紋絲不亂的頭發(fā)上慰安,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音聪铺,去河邊找鬼化焕。 笑死,一個胖子當著我的面吹牛铃剔,可吹牛的內(nèi)容都是我干的撒桨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼键兜,長吁一口氣:“原來是場噩夢啊……” “哼凤类!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起普气,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤谜疤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后现诀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夷磕,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年仔沿,在試婚紗的時候發(fā)現(xiàn)自己被綠了坐桩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡封锉,死狀恐怖绵跷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情成福,我是刑警寧澤碾局,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站闷叉,受9級特大地震影響擦俐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜握侧,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一蚯瞧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧品擎,春花似錦埋合、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜜猾。三九已至,卻和暖如春振诬,著一層夾襖步出監(jiān)牢的瞬間蹭睡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工赶么, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肩豁,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓辫呻,卻偏偏與公主長得像清钥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子放闺,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

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