Android事件分發(fā)機制的探索與發(fā)現(xiàn)之ViewGroup篇

版權(quán)聲明:本文來自門心叼龍的博客儡羔,屬于原創(chuàng)內(nèi)容真仲,轉(zhuǎn)載請注明出處:https://blog.csdn.net/geduo_83/article/details/90145083

github源碼下載地址:https://github.com/geduo83/android-touch-event
Android事件分發(fā)機制的探索與發(fā)現(xiàn)之View篇
Android事件分發(fā)機制的探索與發(fā)現(xiàn)之ViewGroup篇
Android事件分發(fā)機制的探索與發(fā)現(xiàn)之Activity篇
Android事件分發(fā)機制的探索與發(fā)現(xiàn)之總結(jié)篇
Android事件分發(fā)機制在實戰(zhàn)開發(fā)中的應(yīng)用之一
Android事件分發(fā)機制在實戰(zhàn)開發(fā)中的應(yīng)用之二

上一篇文章我們主要講View MyButton的事件分發(fā)流程,這篇主要來分析MyLayout的事件分發(fā)流程,研究方法一樣,通過改變返回值,來觀察事件的分發(fā)流程

MyLayout的onInterceptTouchEvent方法

MyLayout其本質(zhì)是一個ViewGroup铁坎,ViewGroup比View就多了一個事件攔截的方法onInterceptTouchEvent,因此我們MyLayout對的測試先從它的攔截方法開始

  • 情況1:調(diào)用父類的同名方法
@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.v(TAG,"MyLayout onInterceptTouchEvent start:"+MotionEventUtil.getMotionEventName(ev));
        return super.onInterceptTouchEvent(ev);
    }

其實我們上面已經(jīng)測試過了犁苏,我們的測試MyButton的相關(guān)方法的時候硬萍,MyLayout的onInterceptTouchEvent方法調(diào)用的就是父類的同名方法,

V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout onInterceptTouchEvent start:ACTION_DOWN
V/MYTAG: MyButton dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout onTouchEvent start:ACTION_DOWN

事件到達MyLayout onInterceptTouchEvent的方法后围详,調(diào)用了父類的同名方法super.onInterceptTouchEvent后朴乖,事件會繼續(xù)傳遞給MyButton的dispatchTouchEvent 方法進行事件分發(fā)

  • 情況2:返回false
public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.v(TAG,"MyLayout onInterceptTouchEvent start:"+MotionEventUtil.getMotionEventName(ev));
        return false;
    }

點擊測試結(jié)果:

V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout onInterceptTouchEvent start:ACTION_DOWN
V/MYTAG: MyButton dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyButton onTouchEvent start:ACTION_DOWN
----------------------------------------------------------------------------
V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_UP
V/MYTAG: MyLayout dispatchTouchEvent start:ACTION_UP
V/MYTAG: MyLayout onInterceptTouchEvent start:ACTION_UP
V/MYTAG: MyButton dispatchTouchEvent start:ACTION_UP
V/MYTAG: MyButton onTouchEvent start:ACTION_UP

我們發(fā)現(xiàn)MyLayout的onInterceptTouchEvent方法返回false和調(diào)用父類的同名方法super.onInterceptTouchEvent方法,事件的傳遞流程都是一樣的

  • 情況3:返回ture
@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.v(TAG,"MyLayout onInterceptTouchEvent start:"+MotionEventUtil.getMotionEventName(ev));
        return true;
    }
@Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.v(TAG,"MyLayout onTouchEvent start:"+MotionEventUtil.getMotionEventName(event));
        return super.onTouchEvent(event);
    }

點擊測試結(jié)果:

V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout onInterceptTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout onTouchEvent start:ACTION_DOWN
V/MYTAG: MainActivity onTouchEvent start:ACTION_DOWN
--------------------------------------------------------
V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_UP
V/MYTAG: MainActivity onTouchEvent start:ACTION_UP

如果返回true觸摸事件不會繼續(xù)傳遞給MyButton了助赞,而直接就被MyLayout攔截掉了,并將事件傳遞給自己的onTouchEvent方法進行消費

好了买羞,關(guān)于MyLayout的onInterceptTouchEvent方法我們徹底測試完畢了,我們不難得出結(jié)論:當(dāng)onInterceptTouchEvent返回false和調(diào)用父類的同名方法的時候雹食,觸摸事件會繼續(xù)往下傳遞畜普,當(dāng)返回true的時候該事件就被被攔截掉,并交給自己的onTouchEvent方法進行處理

MyLayout的onTouchEvent方法

  • 情況1:調(diào)用父類的同名方法
@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.v(TAG,"MyLayout onInterceptTouchEvent start:"+MotionEventUtil.getMotionEventName(ev));
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.v(TAG,"MyLayout onTouchEvent start:"+MotionEventUtil.getMotionEventName(event));
        return super.onTouchEvent(event);
    }

注意了群叶,為了便于測試我們讓onInterceptTouchEvent返回true
測試結(jié)果:

V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout onInterceptTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout onTouchEvent start:ACTION_DOWN
V/MYTAG: MainActivity onTouchEvent start:ACTION_DOWN
--------------------------------------------------------
V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_UP
V/MYTAG: MainActivity onTouchEvent start:ACTION_UP

通過測試日志我們可以發(fā)現(xiàn)吃挑,當(dāng)MyLayout的onTouchEvent調(diào)用父類的同名方法钝荡,觸摸事件會繼續(xù)回傳給MainActivity的onTouchEvent進行處理,其實在前面我們測試過了舶衬,當(dāng)MyButton的onTouchEvent方法返回false和dispathTouchEvent方法返回false觸摸事件都會回傳給MyLayout的onTouchEvent方法埠通,緊接著就繼續(xù)回傳給MainActivity的onTouchEvent方法

  • 情況2:返回false
 @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.v(TAG,"MyLayout onInterceptTouchEvent start:"+MotionEventUtil.getMotionEventName(ev));
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.v(TAG,"MyLayout onTouchEvent start:"+MotionEventUtil.getMotionEventName(event));
        return false;
    }

測試結(jié)果:

V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout onInterceptTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout onTouchEvent start:ACTION_DOWN
V/MYTAG: MainActivity onTouchEvent start:ACTION_DOWN
---------------------------------------------------------
V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_MOVE
V/MYTAG: MainActivity onTouchEvent start:ACTION_MOVE
---------------------------------------------------------
V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_UP
V/MYTAG: MainActivity onTouchEvent start:ACTION_UP

返回false和調(diào)用父類的同名方法,事件傳遞的流程都是一樣的逛犹,觸摸事件都回傳給了MainActivity的onTouchEvent方法進行處理

  • 情況3:返回true
@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.v(TAG,"MyLayout onInterceptTouchEvent start:"+MotionEventUtil.getMotionEventName(ev));
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.v(TAG,"MyLayout onTouchEvent start:"+MotionEventUtil.getMotionEventName(event));
        return true;
    }

測試結(jié)果:

V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout onInterceptTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout onTouchEvent start:ACTION_DOWN
----------------------------------------------------
V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_UP
V/MYTAG: MyLayout dispatchTouchEvent start:ACTION_UP
V/MYTAG: MyLayout onTouchEvent start:ACTION_UP

返回true很簡單植阴,事件被自己消費掉了
好了,截止到線程關(guān)于MyLayout的onTouchEvent方法就分析完畢了圾浅,我們不難得出結(jié)論:MyLayout的onTouchEvent方法返回true事件就消費掉了,如果返回false和調(diào)用父類的同名方法super.onTouchEvent方法事件就會繼續(xù)回傳給MainActivity的onTouchEvent方法進行處理

MyLayout的dispatchTouchEvent方法

  • 情況1:調(diào)用父類的同名方法
 @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        Log.v(TAG,"MyLayout dispatchTouchEvent start:"+MotionEventUtil.getMotionEventName(ev));
        return super.dispatchTouchEvent(ev);
    }

上面也都測試過了憾朴,如果MyLayout的dispatchTouchEvent調(diào)用了父類的同名方法則觸摸事件會繼續(xù)傳遞給它自己的onInterceptTouchEvent方法進行處理,測試日志如下:

V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout onInterceptTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout onTouchEvent start:ACTION_DOWN
  • 情況2:返回false
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
        Log.v(TAG,"MyLayout dispatchTouchEvent start:"+MotionEventUtil.getMotionEventName(ev));
        return false;
}

點擊測試:

V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MainActivity onTouchEvent start:ACTION_DOWN
--------------------------------------------------------
V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_UP
V/MYTAG: MainActivity onTouchEvent start:ACTION_UP

返回false觸摸事件直接就回傳了給了MainActivity的onTouchEvent方法進行處理了

  • 情況3:返回true
 @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        Log.v(TAG,"MyLayout dispatchTouchEvent start:"+MotionEventUtil.getMotionEventName(ev));
        return true;
    }

點擊測試結(jié)果:

V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_DOWN
V/MYTAG: MyLayout dispatchTouchEvent start:ACTION_DOWN
----------------------------------------------------------
V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_MOVE
V/MYTAG: MyLayout dispatchTouchEvent start:ACTION_MOVE
----------------------------------------------------------
V/MYTAG: MainActivity dispatchTouchEvent start:ACTION_UP
V/MYTAG: MyLayout dispatchTouchEvent start:ACTION_UP

返回true狸捕,觸摸事件就直接被自己的dispatchTouchEvent方法消費掉了
好了,截止目前關(guān)于MyLayout的dispathTouchEvent方法就徹底分析完畢了众雷,結(jié)論如下:MyLayout的dispatchTouchEvent方法調(diào)用父類的同名方法則事件會繼續(xù)往下傳遞給自己的onInterceptTouchEvent方法灸拍,如果返回false則事件會回傳給MainActivity的onTouchEvent方法進行處理,如果返回為true則就自行消費掉了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砾省,一起剝皮案震驚了整個濱河市鸡岗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌编兄,老刑警劉巖轩性,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狠鸳,居然都是意外死亡揣苏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門件舵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卸察,“玉大人,你說我怎么就攤上這事铅祸】又剩” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵临梗,是天一觀的道長涡扼。 經(jīng)常有香客問我,道長夜焦,這世上最難降的妖魔是什么壳澳? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮茫经,結(jié)果婚禮上巷波,老公的妹妹穿的比我還像新娘萎津。我一直安慰自己,他們只是感情好抹镊,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布锉屈。 她就那樣靜靜地躺著,像睡著了一般垮耳。 火紅的嫁衣襯著肌膚如雪颈渊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天终佛,我揣著相機與錄音俊嗽,去河邊找鬼。 笑死铃彰,一個胖子當(dāng)著我的面吹牛绍豁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播牙捉,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼竹揍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了邪铲?” 一聲冷哼從身側(cè)響起芬位,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎带到,沒想到半個月后昧碉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡阴孟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年晌纫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片永丝。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡锹漱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慕嚷,到底是詐尸還是另有隱情哥牍,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布喝检,位于F島的核電站嗅辣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挠说。R本人自食惡果不足惜澡谭,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望损俭。 院中可真熱鬧蛙奖,春花似錦潘酗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至攒砖,卻和暖如春缸兔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吹艇。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工惰蜜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人受神。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓蝎抽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親路克。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

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