返回
透视Android事件分发流程源码剖析
Android
2023-09-24 09:08:46
- Android中的事件
Android事件可以分为三种类型:
- 触摸事件:包括手指按下、移动、抬起、取消等动作。
- 按键事件:包括音量键、返回键、主页键等按键的按下、抬起动作。
- 其他事件:包括电池电量变化、屏幕旋转等事件。
2. Android事件分发流程
Android事件分发流程大致分为以下几个步骤:
- 当用户触发一个事件时,该事件首先会被发送到Activity。
- Activity会将事件分发给它的根View(根View通常是FrameLayout或LinearLayout)。
- 根View会依次将事件分发给它的子View,直到事件被某个子View消费为止。
- 如果没有子View消费该事件,则事件将被传递回Activity。
3. 事件分发涉及的方法
事件分发过程中涉及到以下几个方法:
dispatchTouchEvent()
:该方法用于分发触摸事件。onTouchEvent()
:该方法用于处理触摸事件。onInterceptTouchEvent()
:该方法用于拦截触摸事件。
4. 事件分发源码剖析
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
mDownTime = ev.getDownTime();
}
if (mInstrumentation != null) {
mInstrumentation.onTouchEvent(this, ev);
}
if (mPerformClick || mSendClickAtTime != Long.MAX_VALUE) {
// Perform click actions if needed
if (performClick(ev)) {
return true;
}
}
// If this view doesn't consume the event, forward it to the children
boolean handled = false;
if (!handled) {
handled = onInterceptTouchEvent(ev);
}
if (!handled) {
handled = dispatchTouchEventToViewHierarchy(ev);
}
if (!handled) {
// No child wants to claim the event; consume it here (e.g. scrolling)
handled = onTouchEvent(ev);
}
if (!handled && mAttachInfo != null) {
// Unhandled touch events are sent to the attached window manager
handled = mAttachInfo.mPanelParentWindow.dispatchTouchEvent(ev, this);
}
return handled;
}
以上是dispatchTouchEvent()
方法的源码,该方法首先会检查事件类型是否为ACTION_DOWN
,如果是,则记录按下时间。然后,该方法会检查是否有Instrumentation对象,如果有,则调用onTouchEvent()
方法。接着,该方法会检查是否有未执行的点击操作,如果有,则执行点击操作。
接下来,该方法会检查是否有子View拦截该事件,如果有,则调用onInterceptTouchEvent()
方法。如果没有,则调用dispatchTouchEventToViewHierarchy()
方法,将事件分发给子View。
如果子View没有消费该事件,则该方法会调用onTouchEvent()
方法,处理该事件。如果该方法也没有消费该事件,则该方法会将事件发送给窗口管理器。
5. 总结
Android事件分发机制是Android系统中非常重要的一个组件,它负责将事件从Activity分发到各个View。通过对事件分发流程的源码解析,我们可以更深入地了解Android事件分发的原理,以便在实践中更好地解决相关问题。