onTouch事件的传递机制
一、点击事件传递机制:
- 1.view执行dispatchTouchEvent 方法,开始分发事件,返回值决定是否分发出去
- 2.执行onInterceptHoverEvent 方法,判断是否中断事件,返回值决定是否传递给子View
- 3.执行onTouchEvent 方法,处理事件,返回值告知系统event事件是否被消费
二、流程图
1.Touch事件分发(dispatchTouchEvent)流程图:
2.Touch事件传递机制(onInterceptHoverEvent)流程图:
3.Touch事件处理(onTouchEvent)流程图:
三、和onTouch有关的方法
/**
* 分发事件的方法,最早执行
* @param ev 事件
* @return 返回boolean值,true表示消息被分发出去
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
/**
* 是否中断事件的传递
* 点击事件从view最外层传入内层
*
* @param event 事件
* @return result 返回true时,中断事件,执行自己的onTouchEvent方法
* 返回false时,默认处理,不中断,也不会执行自己的onTouchEvent方法
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return super.onInterceptTouchEvent(event);
}
/**
* 点击事件解析处理
*
* @param event
* @return boolean值,true表示该事件被消费
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
四、在View,ViewGroup,Activity中以上方法的存在情况是不同的
下图奉上View及其子类的继承关系:
1.在View类中有下面两种:
dispatchTouchEvent(MotionEvent ev);
onTouchEvent(MotionEvent ev);
2.在ViewGroup(布局管理器是ViewGroup的子类,所以也继承了这三种方法)中有以上三种方法:
dispatchTouchEvent(MotionEvent ev);
onInterceptTouchEvent(MotionEvent ev);
onTouchEvent(MotionEvent ev);
3.在Activity中有两种:
dispatchTouchEvent(MotionEvent ev);
onTouchEvent(MotionEvent ev);
五、从屏幕点击到事件的消费流程如下图:
常用的MotionEvent事件:
- ACTION_DOWN = 0
- ACTION_UP = 1
- ACTION_MOVE = 2
- ACTION_CANCEL = 3