返回

LEAD Android触摸事件分发:“递”与“归”(一)

Android

在Android中,触摸事件的分发是一个复杂的过程。它涉及到多个组件,包括View、ViewGroup和Activity。触摸事件的分发过程可以分为两个阶段:“递”和“归”。

在“递”阶段,触摸事件从最外层的View传递到最内层的View。在这个过程中,每个View都有机会处理触摸事件。如果某个View处理了触摸事件,那么触摸事件就不会再继续传递下去。

在“归”阶段,触摸事件从最内层的View传递回最外层的View。在这个过程中,每个View都有机会再次处理触摸事件。如果某个View处理了触摸事件,那么触摸事件就会停止传播。

在这一篇博文中,我们将重点关注ACTION_DOWN事件的分发过程。ACTION_DOWN事件是手指第一次接触屏幕时产生的事件。这个事件会触发一系列的回调方法,包括dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()。

dispatchTouchEvent()方法是View类中的一个方法。当View收到触摸事件时,会调用这个方法。在dispatchTouchEvent()方法中,View会依次调用onInterceptTouchEvent()和onTouchEvent()方法。

onInterceptTouchEvent()方法是ViewGroup类中的一个方法。当ViewGroup收到触摸事件时,会调用这个方法。在onInterceptTouchEvent()方法中,ViewGroup可以决定是否要拦截触摸事件。如果ViewGroup拦截了触摸事件,那么触摸事件就不会再传递给子View。

onTouchEvent()方法是View类中的一个方法。当View收到触摸事件时,会调用这个方法。在onTouchEvent()方法中,View可以处理触摸事件。

下面,我们将使用Android Studio的调试器来跟踪ACTION_DOWN事件的分发过程。

  1. 在Android Studio中,打开一个项目。
  2. 在项目中,找到一个Activity类。
  3. 在Activity类的onCreate()方法中,添加以下代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 设置调试器断点
    View view = findViewById(R.id.view);
    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Debugger.startMethodTracing("touch_event");
        }
    });
}
  1. 在Android Studio的工具栏中,点击“Debug”按钮。

  2. 在“Debug”菜单中,选择“Start Profiling”。

  3. 在“Profiling”窗口中,选择“Method Tracing”选项卡。

  4. 点击“Start”按钮。

  5. 在手机上,启动应用程序。

  6. 在应用程序中,点击屏幕上的View。

  7. 在“Profiling”窗口中,点击“Stop”按钮。

  8. 在“Profiling”窗口中,双击“touch_event”方法。

  9. 在“Method Trace”窗口中,可以查看ACTION_DOWN事件的分发过程。

通过上面的步骤,我们可以看到ACTION_DOWN事件的分发过程是一个递归的过程。触摸事件从最外层的View传递到最内层的View,然后再从最内层的View传递回最外层的View。在这个过程中,每个View都有机会处理触摸事件。