一.事情分发传递流程

Android 事情分发传递流程首要分为三个阶段:事情分发阶段、事情捕获阶段和事情处理阶段。下面我将进一步解释这三个阶段的具体内容:

  1. 事情分发阶段

事情分发阶段是从 Activity 的 dispatchTouchEvent() 办法开始,在这一阶段中,体系会先将事情传递给 ViewRootImpl,再由 ViewRootImpl 分发到 Activity 的 decorView,最后经过 View 的 onTouchEvent() 办法交给子 view。

具体流程如下:

  1. Activity 从 ViewRootImpl 中获取 MotionEvent 事情。

  2. ViewRootImpl 调用 ViewGroup 中的 dispatchTouchEvent() 办法,将事情分发给对应的子 View 进行处理。

  3. 子 View 顺次递归处理事情,假如有子 View 阻拦了事情,那么事情就不会再继续传递下去。

  4. 假如依据 onTouchEvent() 回来结果判别当时 View 处理了事情,那么事情就不会向子 View 再次传递。

  5. 假如事情都没有被阻拦,那么这个事情将传递到 Activity 中的 onTouchEvent() 办法中。

  6. 事情捕获阶段

事情捕获阶段是指事情从根 View 开始,顺次由父 View 捕获,直到当时 View,一起将事情自下向上传递给其祖先 View 的一种机制。首要是为了方便更改事情的属性,例如事情的坐标等。

具体流程如下:

  1. 体系会先将事情传递给该事情的目标 View,并将事情从根节点向下传递。

  2. 在向下子 View 传递事情时,父级 View 能够阻拦事情并记载事情的坐标。

  3. 当事情传递到目标 View 的时候,事情的坐标信息会被用来进行对 View 执行操作的计算和判定。

  4. 假如当时 View 阻拦了事情,那么尔后的再次接触事情都会被该 View 标记为 “阻拦状态”,直到事情处理完毕,被放手传递给上级 View。

  5. 事情处理阶段

事情处理阶段是指最终处理 MotionEvent 的目标(除体系等级的)或许被设置成 Action.Cancel 的最后一个 View。在处理阶段中,会依据 View 的事情类型判别该事情是否能够被处理,假如能够则会继续进行处理,否则会将事情传递给父 View 或许其他 View 进行处理,直至事情被处理或许被放弃。

具体流程如下:

  1. 当一个 View 接收到一个 MotionEvent 事情时,它会首先查看自己的 onTouchEvent() 办法是否能够处理该事情。

  2. 假如当时 View 无法处理该事情,那么事情会被传递给上一级父 View 进行处理。

  3. 假如事情一向没有被处理,那么最终会将事情交给体系完结处理。

总的来说,Android 事情分发传递流程的机制是根据 View 树的节点结构,而且支持经过阻拦事情、处理事情和回来事情等手法完成对事情的监测、干涉和呼应。关于 Android 开发人员而言,深刻理解这个事情流程,有助于更完善地开发自己的 Android 应用程序。

二. Android常见的事情类型以及监听方式

Android 事情驱动机制是指经过一系列的事情监听器和回调函数来完成对用户交互操作的监听和相应的机制。Android 体系支持多种类型的事情监听器,包含接触事情监听器、键盘事情监听器、手势事情监听器等,而且经过回调函数来实时监听用户的操作,然后完成对应用程序的操控和交互。下面我将分别介绍一下 Android 事情驱动机制中的各种监听器和回调函数:

  1. 接触事情监听器

接触事情监听器是 Android 事情驱动机制中的核心部分,首要用于对接触事情的监听和处理。在 Android 中,接触事情能够经过 MotionEvent 类来描绘,首要包含三种基本的事情类型:ACTION_DOWN、ACTION_MOVE 和 ACTION_UP。能够经过完成 OnTouchListener 接口来监听接触事情,并重写 onTouch() 办法来处理事情。例如:

view.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 处理按下事情
                break;
            case MotionEvent.ACTION_MOVE:
                // 处理移动事情
                break;
            case MotionEvent.ACTION_UP:
                // 处理抬起事情
                break;
        }
        return false;
    }
});
  1. 键盘事情监听器

键盘事情监听器与接触事情监听器相似,首要用于对键盘事情的监听和处理。在 Android 中,键盘事情能够经过 KeyEvent 类来描绘,首要包含 ACTION_DOWN 和 ACTION_UP 两种基本的事情类型。能够经过完成 OnKeyListener 接口来监听键盘事情,并重写 onKey() 办法来处理事情。例如:

view.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            switch (keyCode) {
                case KeyEvent.KEYCODE_VOLUME_UP:
                    // 处理音量键加事情
                    break;
                case KeyEvent.KEYCODE_VOLUME_DOWN:
                    // 处理音量键减事情
                    break;
            }
        }
        return false;
    }
});
  1. 手势事情监听器

手势事情监听器首要用于对手势事情的监听和处理。在 Android 中,手势事情需要运用 GestureDetector 类来进行监听,并完成 OnGestureListener 和 OnDoubleTapListener 接口来处理手势事情。例如:

// 在 Activity 中实例化 GestureDetector,并将它绑定到 View 上
GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        // 处理单击事情
        return super.onSingleTapConfirmed(e);
    }
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        // 处理双击事情
        return super.onDoubleTap(e);
    }
});
// 绑定 OnTouchListener 和 OnGestureListener
view.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }
});

除了上述的三种事情监听器,Android 还提供了多种其他类型的事情监听器,例如文本改变监听器、列表滚动监听器、视图绘制监听器等,这些监听器经过完成相应的接口和重写对应的回调函数来完成对应用程序的操控和呼应。