Android 事件傳遞

一、事件和手勢

(1) MotionEvent:
所有 Touch 事件都被封裝成了 MotionEvent 對象摸袁,包括 Touch 的位置渠退、時間、歷史記錄以及第幾個手指(多指觸摸)等贤牛。

(2) Touch事件類型:

ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL

(3) 手勢:

Touch事件組成手勢,所有手勢都是以 ACTION_DOWN 開始 ACTION_UP 或ACTION_CANCEL結(jié)束则酝。

(4) 對事件的處理包括三類殉簸,分別為:

傳遞——dispatchTouchEvent()函數(shù)
攔截——onInterceptTouchEvent()函數(shù)(僅ViewGroup)
消費——onTouchEvent()函數(shù)和 OnTouchListener。
一次事件只能被一個view或者viewGroup消費

二沽讹、事件的傳遞流程:

(1) 事件從 Activity的dispatchTouchEvent()開始傳遞般卑,只要沒有被停止或攔截,從最上層的 View(ViewGroup)開始一直往下(子 View)傳遞爽雄。子 View 可以通過 onTouchEvent()對事件進行處理蝠检。

(2) 事件由父 View(即ViewGroup)傳遞給子 View,ViewGroup 可以通過 onInterceptTouchEvent()對事件做攔截挚瘟,停止其往下傳遞叹谁。

(3) 如果事件從上往下傳遞過程中一直沒有被停止,且最底層子 View 沒有消費事件乘盖,事件會反向往上傳遞焰檩,這時父 View(ViewGroup)可以進行消費,如果還是沒有被消費的話订框,最后會到 Activity 的 onTouchEvent()函數(shù)析苫。

(4) 如果 View 沒有對 ACTION_DOWN 進行消費,表明它對此不感興趣,則之后的其他事件不會傳遞過來(也是一種效率提升)衩侥。

(5) OnTouchListener 優(yōu)先于 onTouchEvent()對事件進行消費浪腐。

上面的消費即表示相應(yīng)函數(shù)返回值為 true。

三顿乒、關(guān)鍵方法:

1议街、View事件相關(guān)方法:
(1) dispatchTouchEvent()事件分發(fā)
(2) onTouchEvent() 事件處理

dispatchTouchEvent()方法:如果view對事件感興趣,則會消費事件璧榄,在消費事件時特漩,View.OnTouchListener.onTouch()優(yōu)先級高于View.onTouchEvent():

 public boolean dispatchTouchEvent(MotionEvent event) { 
      if (mOnTouchListener != null && (mViewFlags &    ENABLED_MASK) == ENABLED && 
         mOnTouchListener.onTouch(this, event)) { 
         return true; 
      } 
      return onTouchEvent(event);   
 }

如果有OnTouchListener,優(yōu)先把事件發(fā)送給View.OnTouchListener.onTouch()處理骨杂;如果沒有消費掉涂身,則使用View.onTouchEvent()來處理;

如果到最后View.onTouchEvent()也沒有消費掉搓蚪,則事件會從下往上傳蛤售,調(diào)用ViewGroup.onTouchEvent()和Activity.onTouchEvent();

2、ViewGroup事件相關(guān)方法:
(1) dispatchTouchEvent()事件分發(fā)妒潭;
(2) onInterceptTouchEvent()攔截事件;
(3) onTouchEvent()事件處理; 比view多了一個攔截事件的方法;
如果onInterceptTouchEvent()返回true悴能,則攔截該事件,自己處理雳灾,不會傳遞給子view漠酿;

3、Activity事件相關(guān)方法:
(1) dispatchTouchEvent(MotionEvent ev)谎亩;
(2) onTouchEvent(MotionEvent ev);

四炒嘲、事件處理流程:

![圖1、沒有view對事件感興趣]
view對事件感興趣匈庭,消費了事件
ViewGroup攔截事件的情況

參考:
[Mastering the Android Touch System]
http://files.cnblogs.com/files/sunzn/PRE_andevcon_mastering-the-android-touch-system.pdf
https://www.youtube.com/watch?v=EZAoJU-nUyI

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夫凸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阱持,更是在濱河造成了極大的恐慌夭拌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件紊选,死亡現(xiàn)場離奇詭異啼止,居然都是意外死亡道逗,警方通過查閱死者的電腦和手機兵罢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滓窍,“玉大人卖词,你說我怎么就攤上這事。” “怎么了此蜈?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵即横,是天一觀的道長。 經(jīng)常有香客問我裆赵,道長东囚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任战授,我火速辦了婚禮页藻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘植兰。我一直安慰自己份帐,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布楣导。 她就那樣靜靜地躺著废境,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筒繁。 梳的紋絲不亂的頭發(fā)上噩凹,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音毡咏,去河邊找鬼栓始。 笑死,一個胖子當(dāng)著我的面吹牛血当,可吹牛的內(nèi)容都是我干的幻赚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼臊旭,長吁一口氣:“原來是場噩夢啊……” “哼落恼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起离熏,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤佳谦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后滋戳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钻蔑,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年奸鸯,在試婚紗的時候發(fā)現(xiàn)自己被綠了咪笑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡娄涩,死狀恐怖窗怒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤扬虚,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布努隙,位于F島的核電站,受9級特大地震影響辜昵,放射性物質(zhì)發(fā)生泄漏荸镊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一堪置、第九天 我趴在偏房一處隱蔽的房頂上張望贷洲。 院中可真熱鬧,春花似錦晋柱、人聲如沸优构。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钦椭。三九已至,卻和暖如春碑诉,著一層夾襖步出監(jiān)牢的瞬間彪腔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工进栽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留德挣,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓快毛,卻偏偏與公主長得像格嗅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子唠帝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

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