当触摸事件发生的时候,首先会被 Activity 接收到,然后该 Activity 会通过其内部的
dispatchTouchEvent(MotionEvent)
将事件传递给内部的PhoneWindow
;接着PhoneWindow
会把事件交给DecorView
,再由DecorView
交给根ViewGroup
。剩下的事件传递就只在ViewGroup
和View
之间进行。
- 事件分发机制本质上是一个
深度优先
的遍历算法。事件分发机制的核心代码:
boolean dispatchTouchEvent(MotionEvent e) {
boolean result;
if (onInterceptTouchEvent(e)) { // 父控件可以覆写并返回 true 以拦截
result = super.dispatchTouchEvent(e); // 调用 View 中该方法的实现
} else {
for (child in children) {
result = child.dispatchTouchEvent(e); // 这里的 child 分成 View 和 ViewGroup 两者情形
if (result) break; // 被子控件消费,停止分发
}
}
return result;
}
对于
dispatchTouchEvent()
方法,在 View 的默认实现中,会先交给onTouchEvent()
进行处理,若它返回了 true 就消费了,否则根据触摸的类型,决定是交给OnClickListener
还是OnLongClickListener
继续处理。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于