dispatchTouchEvent事件分發(fā)淺析(二)分發(fā)

前面我們簡(jiǎn)單的了解了代碼

具體代碼可以見https://github.com/2954722256/demo_event

這個(gè)時(shí)候, 我們 打印的設(shè)置暫時(shí)只是打印 MotionEvent.ACTION_DOWN
運(yùn)行項(xiàng)目后, 可以得到結(jié)果

Paste_Image.png

我們先看下View對(duì)應(yīng)可以O(shè)verride的方法

boolean dispatchTouchEvent(MotionEvent ev);
boolean onTouchEvent(MotionEvent ev);

他們分別是 分發(fā)事件 和 觸摸事件


個(gè)人理解為:

現(xiàn)在要做一個(gè)面包, 讓下面人做
如果下面人做了,就ok了
如果下面人沒有做,需要告訴dispatch分發(fā)這個(gè)任務(wù)的人
依次傳遞

Paste_Image.png

(圖片來自網(wǎng)上,如果侵占作者權(quán)益,聯(lián)系我刪除)

dispatchTouchEvent 可以理解成 下達(dá)做面包的指令
onTouchEvent 可以理解成 具體做面包


某個(gè)View的點(diǎn)擊

(圖中的 a , 是繼承 Button)

Paste_Image.png

【EventButton】:

package com.aohuan.test.dodoevent.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;

import com.aohuan.test.dodoevent.tools.TouchEventUtil;

public class EventButton extends Button{
    public EventButton(Context context) {
        super(context);
    }

    public EventButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EventButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        TouchEventUtil.logActionMsg(getClass(),"onTouchEvent",ev);
        return super.onTouchEvent(ev);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        TouchEventUtil.logActionMsg(getClass(),"dispatchTouchEvent",ev);
        return super.dispatchTouchEvent(ev);
    }
}

這里,我們只是在dispatchTouchEvent 和 onTouchEvent 進(jìn)行了打印

當(dāng)我們觸摸【a】的時(shí)候, 會(huì)得到打印

MainActivity    ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
EventButton ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
EventButton ----    onTouchEvent    ---->   ACTION_DOWN ---->   noMsg
Paste_Image.png

我們可以發(fā)現(xiàn)
先調(diào)用了 Activity的 dispatchTouchEvent
再調(diào)用 EventButton 的 dispatchTouchEvent 和 onTouchEvent

對(duì)應(yīng)View來說, 會(huì)從最高的地方,傳遞到View, 獲取到OnTouchEvent 后結(jié)束


我們?cè)賮砜纯碫iewGroup的點(diǎn)擊

某個(gè)ViewGroup的點(diǎn)擊

(圖中的 b , 是繼承 LinearLayout)

Paste_Image.png

【EventViewGroup】:

package com.aohuan.test.dodoevent.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import com.aohuan.test.dodoevent.tools.TouchEventUtil;

public class EventViewGroup extends LinearLayout{
    public EventViewGroup(Context context) {
        super(context);
    }

    public EventViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EventViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        TouchEventUtil.logActionMsg(getClass(),"onTouchEvent",ev);
        return super.onTouchEvent(ev);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        TouchEventUtil.logActionMsg(getClass(),"dispatchTouchEvent",ev);
        return super.dispatchTouchEvent(ev);
    }

}

這里,我們也只是在dispatchTouchEvent 和 onTouchEvent 進(jìn)行了打印

當(dāng)我們觸摸【b】的時(shí)候, 會(huì)得到打印

MainActivity    ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
EventViewGroup  ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
EventViewGroup  ----    onTouchEvent    ---->   ACTION_DOWN ---->   noMsg
MainActivity    ----    onTouchEvent    ---->   ACTION_DOWN ---->   noMsg
Paste_Image.png

我們可以發(fā)現(xiàn)
先調(diào)用了 Activity的 dispatchTouchEvent
再調(diào)用 EventButton 的 dispatchTouchEvent 和 onTouchEvent
不同的是,會(huì)回傳調(diào)用 Activity的 onTouchEvent

** 對(duì)應(yīng)ViewGroup來說, 會(huì)從最高的地方,傳遞到ViewGroup, 獲取到OnTouchEvent 后
,并不會(huì)消費(fèi)帶哦,而是會(huì)再次往回調(diào)用到最高地方的 OnTouchEvent 才結(jié)束
**


下一篇我們可以了解dispatchTouchEvent事件分發(fā)淺析(三)點(diǎn)擊執(zhí)行順序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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