前提
这篇博客主要讲 针对 View 的事件处理机制,所以,不存在 ViewGroup 的事件拦截
知识要点
在这个里面我们 主要关注以下两个方法 :
dispatchTouchEvent 作用:事件分发
onTouchEvent(一般都会被我们复写)
相关源码
// View.java 中的源码
public boolean dispatchTouchEvent(MotionEvent event) {
、、、省略
//初始化 result 标志位 false
boolean result = false;
if (mInputEventConsistencyVerifier != null) {
mInputEventConsistencyVerifier.onTouchEvent(event, 0);
}
//如果 动作为按下 调用 stopNestedScroll() 方法 清除 滚动效果
final int actionMasked = event.getActionMasked();
if (actionMasked == MotionEvent.ACTION_DOWN) {
// Defensive cleanup for new gesture
stopNestedScroll();
}
if (onFilterTouchEventForSecurity(event)) {
if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) {
result = true;
}
//noinspection SimplifiableIfStatement
// ListenerInfo 是一个类 里面封装了很多 事件
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null // 这句话是 true
&& (mViewFlags & ENABLED_MASK) == ENABLED // 这句话也是 true 默认ENABLED
&& li.mOnTouchListener.onTouch(this, event)) { //所以关键是看 这个方法返回 true或false
result = true;
}
if (!result && onTouchEvent(event)) { //View 中的 onTouchEvent方法里会执行 cliclk监听,注意是 View 里
result = true;
}
}
、、、省略
return result;
}
//其中有一个很重要的内部类 ListenerInfo
static class ListenerInfo {
/**
* Listener used to dispatch focus change events.
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
protected OnFocusChangeListener mOnFocusChangeListener;
/**
* Listeners for layout change events.
*/
private ArrayList<OnLayoutChangeListener> mOnLayoutChangeListeners;
protected OnScrollChangeListener mOnScrollChangeListener;
/**
* Listeners for attac

本文深入解析了Android中View的事件处理机制,重点介绍了dispatchTouchEvent和onTouchEvent方法的作用及实现原理,并详细分析了setOnTouchListener监听Touch事件的过程。
最低0.47元/天 解锁文章
539

被折叠的 条评论
为什么被折叠?



