事件分發(fā)機制精簡

當(dāng)我們手指觸摸屏幕是觸摸時間開始一級一級向下傳遞

開始-->摁下-->down事件-->滑動-->move事件-->抬起手指-->up事件-->結(jié)束
|-->非人為取消-->cancel事件|

MotionEvent在手機View中的傳遞就是事件分發(fā)的本質(zhì)
我們可以簡單的把應(yīng)用UI組件分成三級掌腰, Activity(Windows級)乎完, ViewGroup, View僚饭。
ViewGropu繼承View因此它也可以作為子組件View放在其他ViewGroup下這樣才能形成層級復(fù)雜的布局假瞬。
在這些組件中參與事件分發(fā)的方法分別有:dispatchTouchEvent(); onInterceptTouchEvent(); onTouchEvent();

dispatchTouchEvent() 分發(fā)點擊事件考婴, 當(dāng)點擊事件能都傳到當(dāng)前View時調(diào)用
onInterceptTouchEvent() 是否攔截事件,只存在于Viewgroup, 在dispatchTouchEvent()中被調(diào)用
onTouchEvnet() 處理點擊事件, 在dispachTouchEvnet()內(nèi)部調(diào)用

分發(fā)順序:Activity(Windows)-->ViewGroup-->View

下面是事件流程圖: true/false為相應(yīng)方法返回值, super則是調(diào)用默認(rèn)實現(xiàn)

clipboard.png
  1. 事件傳遞到activity , dispatchTouchEvent返回ture/false結(jié)束傳遞赋咽, 執(zhí)行spuer向下傳遞旧噪。
  2. 事件傳遞到Viewgroup dispatchTouchevent返回true表示攔截不處理直接結(jié)束傳遞, 返回false表示攔不處理讓上層Activity處理即Activity的onTouchEvent處理脓匿,Activity的 onTouchEvent不管返回true/false結(jié)束傳遞淘钟。執(zhí)行super則繼續(xù)向下傳遞
  3. 事件傳遞到ViewGroup的onInterTouchevent, onInterTouchEvent返回true表示本ViewGroup將攔截事件,事件傳遞給ViewGroup的onTouchEvent進(jìn)行處理陪毡。
  4. ViewGroup的onToucheEvent返回True則事件結(jié)束處理米母,返回super或false則傳遞上層Activity的onTouchEvent再次處理。這里返回fase(super)默認(rèn)返回false, 相當(dāng)于dipatchTouchEvent返回了false,于是可以傳遞到上層的onTouchEvent事件中
  5. onInterceptTouchEvent接收傳遞過來的事件返回false或默認(rèn)super(默認(rèn)false)表示ViewGroup不攔截事件繼續(xù)向下傳遞
  6. 這樣一層一層傳遞到手指所摁下的View上毡琉,View dipatchTouchEvent返回true表示攔截不處理事件傳遞結(jié)束铁瞒,返回false則需要傳遞到上層的onToucheEvent進(jìn)行處理,返回super表示傳遞給當(dāng)前View的onTouchEvent進(jìn)行處理
  7. 同樣View onToucheEvent返回true則消耗事件結(jié)束傳遞桅滋,返回false則向上層onTouchEvent傳遞慧耍,也就是dispatchToucheEvent返回了false。

至此一個事件的傳遞過程各種情況分析完成

MOVE事件丐谋; UP事件

  1. 默認(rèn)情況下雖然ViewGroup onInterceptTouchEvent對DOWN事件返回了false, 但后續(xù)MOVE芍碧,UP依然傳遞給他的onInterceptTouchEvent方法;
  2. DOWN事件傳遞到View的onTouchEvent方法并返回true時,MOVE和UP也將傳遞到這個onTouchEvent中
  3. ViewGroup 的onInterceptTouchEvent一旦返回true則不再被調(diào)用号俐,MOVE和UP事件則直接到ViewGroup的onToucheEnent中不經(jīng)過onTnterceptTouchEnvent泌豆。
  4. DOWN事件傳遞到View并返回true, ViewGroup的onInterceptTouchEvnet返回true攔截MOVE事件,該事件并沒有傳遞給ViewGroup 的onTouchEvnet將會被系統(tǒng)變成一個CANCEL事件傳給View的OntouchEvent; ViewGroup 的onInterceptToucheEvent一旦返回true后續(xù)事件就不會再傳過來了
  5. 如果ViewGroup攔截了半路的MOVE同樣也是變成CANCEL事件傳遞到之前處理事件的View中

注意:

  1. View 的dispatchTouchEvent只有下面三個都為真才返回true

第一個條件:mOnTouchListener != null吏饿;
第二個條件:(mViewFlags & ENABLED_MASK) == ENABLED踪危;
第三個條件:mOnTouchListener.onTouch(this, event)蔬浙;

  1. onTouch 執(zhí)行高于onClick. onClick在onTouchEvent方法里的performClick執(zhí)行
    onTouch 返回false沒有消費,dispatchTouchEvent返回false陨倡,繼續(xù) onTouchEvent 然后Onclick
  2. 如果控件為 非enable則onTouch不會執(zhí)行敛滋,如果想監(jiān)聽touch則重寫onTouchEvent
  3. 注冊了Touch事件則DOWN,MOVE兴革,UP都會觸發(fā)绎晃,只有dispatchTouchEvent返回false其他不會執(zhí)行
  4. dispatchTouchEvent和onTouchEvnet返回true消費事件停止傳遞
  5. 如果dispatchTouchEvnet返回true那么收到DOWN的也會收到MOVE和UP
  6. 如果onTouchEvent消費事件返回true, MOVE和UP直接傳到改View后不再下傳而直接onTouchEvent結(jié)束
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杂曲,一起剝皮案震驚了整個濱河市庶艾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌擎勘,老刑警劉巖咱揍,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異棚饵,居然都是意外死亡煤裙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門噪漾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硼砰,“玉大人,你說我怎么就攤上這事欣硼√夂玻” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵诈胜,是天一觀的道長豹障。 經(jīng)常有香客問我,道長焦匈,這世上最難降的妖魔是什么血公? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮缓熟,結(jié)果婚禮上坞笙,老公的妹妹穿的比我還像新娘。我一直安慰自己荚虚,他們只是感情好薛夜,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著版述,像睡著了一般梯澜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天晚伙,我揣著相機與錄音吮龄,去河邊找鬼。 笑死咆疗,一個胖子當(dāng)著我的面吹牛漓帚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播午磁,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼尝抖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了迅皇?” 一聲冷哼從身側(cè)響起昧辽,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎登颓,沒想到半個月后搅荞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡框咙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年咕痛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喇嘱。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡茉贡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婉称,到底是詐尸還是另有隱情块仆,我是刑警寧澤构蹬,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布王暗,位于F島的核電站,受9級特大地震影響庄敛,放射性物質(zhì)發(fā)生泄漏俗壹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一藻烤、第九天 我趴在偏房一處隱蔽的房頂上張望绷雏。 院中可真熱鬧,春花似錦怖亭、人聲如沸涎显。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽期吓。三九已至,卻和暖如春倾芝,著一層夾襖步出監(jiān)牢的瞬間讨勤,已是汗流浹背箭跳。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留潭千,地道東北人谱姓。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像刨晴,于是被迫代替她去往敵國和親屉来。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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