谁调用Activity.dispatchTouchEvent(事件)?

时间:2013-12-16 18:17:28

标签: android android-sensors

我正在尝试将文件中的触摸事件添加到当前应用程序(根据文件中的数据构建新的触摸事件),并且我试图了解“真实”触摸事件时的调用链被触发了。

在我进行的所有搜索中,我发现Activity.dispatchTouchEvent(ev)是我们有触摸事件时调用的第一个方法,然后将其转发到ViewGroup.dispatchTouchEvent,然后转发到View.dispatchTouchEvent。

我想在Activity.dispatchTouchEvent(ev)之前找到所调用的内容,以及如何将事件从HW转移到此方法。

2 个答案:

答案 0 :(得分:0)

在Activty中,方法dispatchTouchEvent为:

 public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        onUserInteraction();
    }
    if (getWindow().superDispatchTouchEvent(ev)) {
        return true;
    }
    return onTouchEvent(ev);
}

您必须在自己的活动中调用super.dispatchTouchEvent()方法。

使您可以到达此行:getWindow().superDispatchTouchEvent(ev)

getWindwow()返回 PhoneWindow 的实例。

PhoneWindow.superDispatchTouchEvent()将调用DecorView的方法 ,并在该方法中调用DecorView.dispatchTouchEvent

因此该事件已传递给视图。

    //in Class PhoneWindow
 public boolean superDispatchTouchEvent(MotionEvent event) {
      return mDecor.superDispatchTouchEvent(event);
 }

//in class DecorView
public boolean superDispatchTouchEvent(MotionEvent event) {
      return super.dispatchTouchEvent(event);
}

答案 1 :(得分:0)

也许您想要的是android输入框架的工作方式。以下有关android输入框架架构的博客可能会对您有所帮助。

Android Input Framework Architecture[Part 1] : Introduction to InputReader & InputDispatcher

输入过程可以简单地表示为:

输入硬件------>内核/驱动程序(输入协议)-----> EventHub(framework / base / libs / ui)getevent ------> InputReader ----> inputDispatcher ---->窗口管理器。

  1. 首先,InputReader将元输入事件转换为android事件(例如MotionEvent / KeyEvent)。
  2. 然后,InputDispatcher将事件分配给WindowManager
  3. WindowManager调用Window.Callback.dispatchTouchEvent(***)。