【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )

简介: 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )

文章目录

Android 事件分发 系列文章目录

一、Activity 的事件传递

二、PhoneWindow 事件传递

三、DecorView 事件传递

四、ViewGroup 事件传递





一、Activity 的事件传递


手指触摸到 Android 手机屏幕时 , 先由硬件驱动层产生事件 , 然后传递到 Framework 层 , 之后传递到 AMS , 最后到 Activity 界面中 ;


在 Activity 界面中 , 会第一时间调用 dispatchTouchEvent 方法 , 然后会按照下图的层级 , 逐步向下分发触摸事件 ;

image.png



Activity | dispatchTouchEvent 分析 :


先判定该触摸事件是否是按下操作 , MotionEvent.ACTION_DOWN ;


触摸事件有 4 44 种操作 :


按下 : MotionEvent.ACTION_DOWN ;

移动 : MotionEvent.ACTION_MOVE ;

抬起 : MotionEvent.ACTION_UP ;

取消 : MotionEvent.ACTION_CANCEL , 手指移出组件边界 , 产生取消事件 ;


Activity | dispatchTouchEvent 源码示例 :


public class Activity extends ContextThemeWrapper
        implements LayoutInflater.Factory2,
        Window.Callback, KeyEvent.Callback,
        OnCreateContextMenuListener, ComponentCallbacks2,
        Window.OnWindowDismissedCallback, WindowControllerCallback,
        AutofillManager.AutofillClient {
    /**
     * Called to process touch screen events.  You can override this to
     * intercept all touch screen events before they are dispatched to the
     * window.  Be sure to call this implementation for touch screen events
     * that should be handled normally.
     *
     * @param ev The touch screen event.
     *
     * @return boolean Return true if this event was consumed.
     */
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
          // 判定是否是第一次按下 
          // 该方法与事件传递机制流程无关 
          // 提供给用户按下时可以执行的业务逻辑 
            onUserInteraction();
        }
  // getWindow() 获取的是 PhoneWindow 窗口 
  // 调用 PhoneWindow 的 superDispatchTouchEvent ; 
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }
    public void onUserInteraction() {
    }
}


源码地址 : /frameworks/base/core/java/android/app/Activity.java






二、PhoneWindow 事件传递


在上述 Activity 的 dispatchTouchEvent 方法中 , 调用了 PhoneWindow 的 superDispatchTouchEvent 方法 ;

Activity 的下一层是 PhoneWindow ;


PhoneWindow | superDispatchTouchEvent 源码 :


public class PhoneWindow extends Window implements MenuBuilder.Callback {
    // This is the top-level view of the window, containing the window decor.
    private DecorView mDecor;
    @Override
    public boolean superDispatchTouchEvent(MotionEvent event) {
        return mDecor.superDispatchTouchEvent(event);
    }
}


源码路径 : /frameworks/base/core/java/com/android/internal/policy/PhoneWindow.java






三、DecorView 事件传递


在 PhoneWindow 的 superDispatchTouchEvent 方法中 , 调用了 DecorView 的 superDispatchTouchEvent 方法 ;

PhoneWindow 的下一层是 DecorView ;


DecorView | superDispatchTouchEvent 源码 :


public class DecorView extends FrameLayout implements RootViewSurfaceTaker, WindowCallbacks {
    public boolean superDispatchTouchEvent(MotionEvent event) {
        return super.dispatchTouchEvent(event);
    }
}


源码路径 : /frameworks/base/core/java/com/android/internal/policy/DecorView.java






四、ViewGroup 事件传递


DecorView 中的 superDispatchTouchEvent 中 , 调用父类的 superDispatchTouchEvent 方法 , 这里涉及到事件分发 superDispatchTouchEvent 方法的 DecorView 的父类是 ViewGroup ;


DecorView 是 FrameLayout 的子类 , FrameLayout 是 ViewGroup 的子类 ;


@UiThread
public abstract class ViewGroup extends View implements ViewParent, ViewManager {
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    }
}


目录
相关文章
|
12月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1118 4
|
程序员 开发工具 Android开发
Android|WebView 禁止长按,限制非白名单域名的跳转层级
如何限制 WebView 仅域名白名单网址能随意跳转,并禁用长按选择文字。
225 2
|
Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
Android面试高频知识点(1) 图解 Android 事件分发机制
164 1
|
Android开发
Android 事件分发机制详细解读
Android 事件分发机制详细解读
201 5
|
XML 前端开发 Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
在Android开发中,事件分发机制是一块Android比较重要的知识体系,了解并熟悉整套的分发机制有助于更好的分析各种点击滑动失效问题,更好去扩展控件的事件功能和开发自定义控件,同时事件分发机制也是Android面试必问考点之一,如果你能把下面的一些事件分发图当场画出来肯定加分不少。废话不多说,总结一句:事件分发机制很重要。
412 9
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件
|
开发工具 Android开发
Android项目架构设计问题之组件A通知组件B某个事件的发生如何解决
Android项目架构设计问题之组件A通知组件B某个事件的发生如何解决
113 0
|
Android开发
39. 【Android教程】触摸事件分发
39. 【Android教程】触摸事件分发
110 2

热门文章

最新文章