返回
从源码梳理Android事件分发机制
见解分享
2024-01-18 18:25:20
Android事件分发的本质
在Android系统中,事件分发是一个复杂而重要的过程。当用户与屏幕交互时,系统会生成一系列事件,这些事件携带有关触摸点位置、动作类型等信息。事件分发系统负责将这些事件传递到正确的视图(View)进行处理。
事件分发流程
事件分发流程大致可以分为以下几个阶段:
- 事件生成: 用户通过触摸、滑动等动作触发事件,系统生成TouchEvent对象。
- Activity分发: TouchEvent首先传递给当前Activity的Window对象,Window会根据Activity的布局结构分发事件。
- DecorView分发: Window将事件传递给DecorView,这是Activity的根视图,它负责协调事件分发。
- ViewGroup分发: DecorView将事件传递给根ViewGroup,ViewGroup会逐层向下分发事件,直到找到要处理该事件的视图。
- View处理: 找到要处理事件的View后,View会执行相应的事件处理逻辑。
关键类和方法
在事件分发过程中,涉及到多个关键类和方法:
- TouchEvent: 事件对象,携带事件信息。
- Activity: 管理应用程序的生命周期和事件分发。
- Window: Activity的窗口,负责处理Activity的事件分发。
- DecorView: Activity的根视图,协调事件分发。
- ViewGroup: ViewGroup负责管理其子视图的布局和事件分发。
- View: 负责处理用户交互事件。
- dispatchTouchEvent(): 用于分发TouchEvent的关键方法。
源码梳理
为了深入理解事件分发机制,我们来逐一梳理源码:
1. Activity的dispatchTouchEvent()方法:
public boolean dispatchTouchEvent(MotionEvent ev) {
// 省略部分代码
if (mWindow.superDispatchTouchEvent(ev)) {
return true;
}
// 省略部分代码
return onTouchEvent(ev);
}
- Activity的dispatchTouchEvent()方法首先调用Window的superDispatchTouchEvent()方法,将事件传递给Window。
- 如果Window处理了事件,则返回true;否则,调用Activity自己的onTouchEvent()方法进行处理。
2. Window的superDispatchTouchEvent()方法:
public boolean superDispatchTouchEvent(MotionEvent ev) {
return mDecor.dispatchTouchEvent(ev);
}
- Window的superDispatchTouchEvent()方法将事件直接传递给DecorView的dispatchTouchEvent()方法。
3. DecorView的dispatchTouchEvent()方法:
public boolean dispatchTouchEvent(MotionEvent event) {
// 省略部分代码
return super.dispatchTouchEvent(event);
}
- DecorView的dispatchTouchEvent()方法调用其父类ViewGroup的dispatchTouchEvent()方法。
4. ViewGroup的dispatchTouchEvent()方法:
public boolean dispatchTouchEvent(MotionEvent ev) {
// 省略部分代码
boolean handled = dispatchTransformedTouchEvent(ev, true);
if (!handled) {
handled = super.dispatchTouchEvent(ev);
}
return handled;
}
- ViewGroup的dispatchTouchEvent()方法首先调用dispatchTransformedTouchEvent()方法,对事件进行转换处理。
- 如果事件未被处理,则调用父类的dispatchTouchEvent()方法继续分发。
5. View的dispatchTouchEvent()方法:
public boolean dispatchTouchEvent(MotionEvent event) {
if (!onFilterTouchEventForSecurity(event)) {
return false;
}
return onTouchEvent(event);
}
- View的dispatchTouchEvent()方法首先调用onFilterTouchEventForSecurity()方法进行安全过滤。
- 如果事件通过安全过滤,则调用onTouchEvent()方法进行事件处理。
结语
通过对Android事件分发源码的梳理,我们深入了解了事件从触发到处理的整个流程。理解事件分发机制对于优化应用程序性能和响应性至关重要。掌握这些知识,您将能够编写出更加健壮和高效的Android应用程序。