dispatchTouchEvent事件分发浅析(二)分发
前面我们简单的了解了代码
具体代码可以见https://github.com/2954722256/demo_event
这个时候, 我们 打印的设置暂时只是打印 MotionEvent.ACTION_DOWN
运行项目后, 可以得到结果
我们先看下View对应可以Override的方法
boolean dispatchTouchEvent(MotionEvent ev);
boolean onTouchEvent(MotionEvent ev);
他们分别是 分发事件 和 触摸事件
个人理解为:
现在要做一个面包, 让下面人做
如果下面人做了,就ok了
如果下面人没有做,需要告诉dispatch分发这个任务的人
依次传递
(图片来自网上,如果侵占作者权益,联系我删除)
dispatchTouchEvent 可以理解成 下达做面包的指令
onTouchEvent 可以理解成 具体做面包
某个View的点击
(图中的 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 进行了打印
当我们触摸【a】的时候, 会得到打印
MainActivity ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
EventButton ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
EventButton ---- onTouchEvent ----> ACTION_DOWN ----> noMsg
Paste_Image.png
我们可以发现
先调用了 Activity的 dispatchTouchEvent
再调用 EventButton 的 dispatchTouchEvent 和 onTouchEvent
对应View来说, 会从最高的地方,传递到View, 获取到OnTouchEvent 后结束
我们再来看看ViewGroup的点击
某个ViewGroup的点击
(图中的 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 进行了打印
当我们触摸【b】的时候, 会得到打印
MainActivity ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
EventViewGroup ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
EventViewGroup ---- onTouchEvent ----> ACTION_DOWN ----> noMsg
MainActivity ---- onTouchEvent ----> ACTION_DOWN ----> noMsg
Paste_Image.png
我们可以发现
先调用了 Activity的 dispatchTouchEvent
再调用 EventButton 的 dispatchTouchEvent 和 onTouchEvent
不同的是,会回传调用 Activity的 onTouchEvent
** 对应ViewGroup来说, 会从最高的地方,传递到ViewGroup, 获取到OnTouchEvent 后
,并不会消费带哦,而是会再次往回调用到最高地方的 OnTouchEvent 才结束
**
下一篇我们可以了解dispatchTouchEvent事件分发浅析(三)点击执行顺序