0%

View的事件传递机制分析

Android视图由两个基类组件组成:View、ViewGroup。与事件相关的有三个主要方法,dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent。那么理解了View和ViewGroup中的这三个方法(View没有onInterceptTouchEvent方法),基本就能清楚Android的时间传递机制。查阅源码最能深刻理解传递过程。

Android视图关系为:ViewGroup包含View或ViewGroup。事件传递入口为ViewGroup.dispatchTouchEvent。

事件分发–ViewGroup.dispatchTouchEvent

上一篇文章做分析

事件拦截–ViewGroup.onInterceptTouchEvent

1
2
3
4
5
6
7
8
9
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.isFromSource(InputDevice.SOURCE_MOUSE)
&& ev.getAction() == MotionEvent.ACTION_DOWN
&& ev.isButtonPressed(MotionEvent.BUTTON_PRIMARY)
&& isOnScrollbarThumb(ev.getX(), ev.getY())) {
return true;
}
return false;
}

一目了然的源代码,一般不做拦截。

事件分发–View.dispatchTouchEvent

1
2
3
4
5
6
7
8
9
10
11
12
13

...
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;
}
...

总结:如果设置了OnTouchListener,则调用其onTouch方法。若没有设置或没有消费事件,则调用View本身的onTouch方法。

事件处理–ViewGroup.onTouchEvent/View.onTouchEvent

ViewGroup继承于View,ViewGroup没有实现onTouchEvent,所以ViewGroup.onTouchEvent=View.onTouchEvent。
onTouchEvent总结:处理点击事件,按下状态,点击声音