Android事件傳遞機(jī)制

參考《android中的事件傳遞和處理機(jī)制》 侵刪

理解一些事情

ViewGroup(如LinearLayout、RelativeLayout等繼承ViewGroup的)中酬蹋,有下面三個(gè)方法:
dispatchTouchEvent 該方法用來分發(fā)事件
onInterceptTouchEvent 用來攔截事件
onTouchEvent 用來處理事件

View(如Button糖声、TextView等繼承View的)中,只有兩個(gè)方法葵陵,即:
dispatchTouchEvent 該方法用來分發(fā)事件
onTouchEvent 用來處理事件
為什么View沒有onInterceptTouchEvent方法液荸?因?yàn)閂iew里面已經(jīng)不能再包含View了,不需要再處理攔截時(shí)間的分發(fā)脱篙。

例子

寫了個(gè)布局

<?xml version="1.0" encoding="utf-8"?>
<com.zyou.myapplication.ViewGroupA
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:background="@android:color/holo_red_light">

        <com.zyou.myapplication.MyView
            android:id="@+id/btn_button"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:background="@android:color/holo_blue_dark"/>

</com.zyou.myapplication.ViewGroupA>

紅色的就是ViewGroupA娇钱,藍(lán)色就是MyView。


image.png

并在View绊困、ViewGroupA文搂、ViewGroupB復(fù)寫方法,并加入LOG信息考抄。

public class ViewGroupA extends LinearLayout {

    private final String TAG="fzy";

    public ViewGroupA(Context context) {
        super(context);
    }

    public ViewGroupA(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public ViewGroupA(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.d(TAG,"ViewGroupA onInterceptTouchEvent ");
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.d(TAG,"ViewGroupA dispatchTouchEvent ");
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d(TAG,"ViewGroupA onTouchEvent ");
        return super.onTouchEvent(event);
    }
}

現(xiàn)在來點(diǎn)擊中間黃色的MyView细疚,觀察下打印結(jié)果,如下:

MainActivity2 dispatchTouchEvent: 0
ViewGroupA dispatchTouchEvent: 0
ViewGroupA onInterceptTouchEvent: 0
MyView dispatchTouchEvent: 0
MyView onTouchEvent :0
ViewGroupA onTouchEvent: 0
MainActivity2 onTouchEvent: 0
MainActivity2 dispatchTouchEvent: 2
MainActivity2 onTouchEvent: 2
MainActivity2 dispatchTouchEvent: 2
MainActivity2 onTouchEvent: 2
MainActivity2 dispatchTouchEvent: 2
MainActivity2 onTouchEvent: 2
MainActivity2 dispatchTouchEvent: 1
MainActivity2 onTouchEvent: 1

可以看到我們當(dāng)touch的是MyView:
1. 首先處理事件分發(fā)的是MainActivity2的dispatchTouchEvent川梅,然后把事件往下傳遞給ViewGroupA疯兼。
2. 如果ViewGroupA的onInterceptTouchEvent沒有進(jìn)行攔截,則把事件傳給MyView贫途。
3. 由MyView的onTouchEvent進(jìn)行時(shí)間處理吧彪。如果方法都返回super.onTouchEvent,最后的ACITON_MOVE/ACTION_UP事件都不再經(jīng)過ViewGroupA和MyView丢早,而是直接在MainActivity2處理姨裸。

下面我們來測試一下,把ViewGroupA的onInterceptTouchEvent返回true怨酝,表示事件不再往下傳遞傀缩,即傳遞不到MyView了,表示ViewGroupA已經(jīng)處理农猬,不需要往下傳了赡艰,以下是LOG:

MainActivity2 dispatchTouchEvent: 0
ViewGroupA dispatchTouchEvent: 0
ViewGroupA onInterceptTouchEvent: 0
ViewGroupA onTouchEvent: 0
MainActivity2 onTouchEvent: 0
MainActivity2 dispatchTouchEvent: 2
MainActivity2 onTouchEvent: 2
MainActivity2 dispatchTouchEvent: 2
MainActivity2 onTouchEvent: 2
MainActivity2 dispatchTouchEvent: 2
MainActivity2 onTouchEvent: 2
MainActivity2 dispatchTouchEvent: 1
MainActivity2 onTouchEvent: 1

總結(jié)

用戶點(diǎn)擊屏幕,分發(fā)事件是由Activity–>ViewGroupA–>MyView走的斤葱,而onTouchEvent是從MyView–>ViewGroupA–>Activity慷垮,中途如果有onInterceptTouchEvent攔截事件揖闸,則dispatchTouchEvent不會(huì)往下傳遞,就回去了料身。整個(gè)過程有點(diǎn)像跳高汤纸,onInterceptTouchEvent相當(dāng)于是塊板。

最后補(bǔ)一張事件分發(fā)圖:


這里寫圖片描述
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芹血,一起剝皮案震驚了整個(gè)濱河市贮泞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌幔烛,老刑警劉巖隙畜,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異说贝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)慎颗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門乡恕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俯萎,你說我怎么就攤上這事傲宜。” “怎么了夫啊?”我有些...
    開封第一講書人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵函卒,是天一觀的道長。 經(jīng)常有香客問我撇眯,道長报嵌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任熊榛,我火速辦了婚禮锚国,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘玄坦。我一直安慰自己血筑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開白布煎楣。 她就那樣靜靜地躺著豺总,像睡著了一般。 火紅的嫁衣襯著肌膚如雪择懂。 梳的紋絲不亂的頭發(fā)上喻喳,一...
    開封第一講書人閱讀 52,166評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音休蟹,去河邊找鬼沸枯。 笑死日矫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绑榴。 我是一名探鬼主播哪轿,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼翔怎!你這毒婦竟也來了窃诉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赤套,失蹤者是張志新(化名)和其女友劉穎飘痛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體容握,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宣脉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剔氏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塑猖。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谈跛,靈堂內(nèi)的尸體忽然破棺而出羊苟,到底是詐尸還是另有隱情,我是刑警寧澤感憾,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布蜡励,位于F島的核電站,受9級(jí)特大地震影響阻桅,放射性物質(zhì)發(fā)生泄漏凉倚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一嫂沉、第九天 我趴在偏房一處隱蔽的房頂上張望占遥。 院中可真熱鬧,春花似錦输瓜、人聲如沸瓦胎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搔啊。三九已至,卻和暖如春北戏,著一層夾襖步出監(jiān)牢的瞬間负芋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旧蛾,地道東北人莽龟。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像锨天,于是被迫代替她去往敵國和親毯盈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359

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