返回

透视Android事件分发流程源码剖析

Android

  1. Android中的事件

Android事件可以分为三种类型:

  • 触摸事件:包括手指按下、移动、抬起、取消等动作。
  • 按键事件:包括音量键、返回键、主页键等按键的按下、抬起动作。
  • 其他事件:包括电池电量变化、屏幕旋转等事件。

2. Android事件分发流程

Android事件分发流程大致分为以下几个步骤:

  1. 当用户触发一个事件时,该事件首先会被发送到Activity。
  2. Activity会将事件分发给它的根View(根View通常是FrameLayout或LinearLayout)。
  3. 根View会依次将事件分发给它的子View,直到事件被某个子View消费为止。
  4. 如果没有子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事件分发的原理,以便在实践中更好地解决相关问题。