前面我們簡(jiǎn)單的了解了代碼
具體代碼可以見https://github.com/2954722256/demo_event
這個(gè)時(shí)候, 我們 打印的設(shè)置暫時(shí)只是打印 MotionEvent.ACTION_DOWN
運(yùn)行項(xiàng)目后, 可以得到結(jié)果
我們先看下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ù)的人
依次傳遞
(圖片來自網(wǎng)上,如果侵占作者權(quán)益,聯(lián)系我刪除)
dispatchTouchEvent 可以理解成 下達(dá)做面包的指令
onTouchEvent 可以理解成 具體做面包
某個(gè)View的點(diǎn)擊
(圖中的 a , 是繼承 Button)
【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
我們可以發(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)
【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
我們可以發(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é)束
**