Android中的事件分发流程

1. View中的事件分发流程

dispatchTouchEvent 核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public boolean dispatchTouchEvent(MotionEvent event) {
......
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
result = true;
}

if (!result && onTouchEvent(event)) {
result = true;
}
.....
return result;
}
在dispatch中对 mOnTouchListener 事件进行了处理,由此可见mOnTouchListener对分发的影响,要高于onCLick以及onLongClick 。 如果没有在mOnTouchListener中进行消费,那么View中的分发,在此处进入到了 onTouchEvent 进行处理

在View的onTouchEvent中,主要是对于MotionEvent.ACTION_DOWN、MotionEvent.ACTION_UP 、MotionEvent.ACTION_MOVE 事件进行处理

1. MotionEvent.ACTION_UP:


在up 事件中,首先会进行longClick事件的判断,如果返回false,那么就不在执行 onClick事件

2. MotionEvent.ACTION_DOWN:

在这里插入图片描述
在down事件中,首先设置了一个longClick的runnable,进行检查

3. MotionEvent.ACTION_MOVE:

在这里插入图片描述

2. ViewGroup 中的分发流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public boolean dispatchTouchEvent(MotionEvent ev) {
......
// 利用disallowIntercept 和 onInterceptTouchEvent 进行是否拦截的判断
if (actionMasked == MotionEvent.ACTION_DOWN
|| mFirstTouchTarget != null) {
final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;
if (!disallowIntercept) {
intercepted = onInterceptTouchEvent(ev);
ev.setAction(action); // restore action in case it was changed
} else {
intercepted = false;
}
} else {
// There are no touch targets and this action is not an initial down
// so this view group continues to intercept touches.
intercepted = true;
}