点击上方“IT烂笔头”,选择“置顶公众号”
第一时间获取 IT 技术干货!


Android图形子系统核心机制全链路剖析
阅读文本大概需要 15 分钟。

①主要的类
DecorView、ViewRootImpl、Window、WMS、Surface、SurfaceFlinger、BufferQueue、FrameBuffer
1. DecorView
是 Android 视图系统里的关键组件,在 Activity 界面显示与布局管理方面扮演着重要角色。下面详细介绍其主要作用:
1.1 作为视图树的根节点
DecorView 是每个 Activity 视图树的顶级视图,继承自 FrameLayout。当 Activity 启动时,系统会创建一个 Window 对象(通常是 PhoneWindow),并为其关联一个 DecorView。所有添加到 Activity 中的视图,最终都会被添加到 DecorView 之下,形成一个完整的视图树。示例如下:
DecorView
├─ 状态栏区域
├─ 标题栏区域(可选)
└─ ContentParent(id 为 android.R.id.content)
└─ 用户自定义布局
├─ 子视图 1
├─ 子视图 2
└─ ...
1.2 承载系统界面元素
DcorView 会包含一些系统级的界面元素,像状态栏、标题栏(在启用的情况下)。这些元素由系统统一管理,且通常位于用户自定义布局的上方。借助 DecorView,系统能够统一管理这些公共界面元素的显示与交互。
1.3 关联 Window 和视图树
DecorView是Window和视图树之间的桥梁。Window代表屏幕上的一个显示区域,而DecorView则是这个区域内视图的容器。Window的属性(如背景、透明度等)会影响DecorView的显示效果,DecorView也会将用户的交互事件传递给Window进行处理。
1.4 处理输入事件分发
DecorView是输入事件进入视图树的入口。当用户触摸屏幕、按下按键等操作发生时,系统会将事件传递给DecorView,然后由DecorView将事件分发给其下的子视图。在事件分发过程中,DecorView会根据视图的层级和位置,决定哪个子视图应该接收和处理该事件。
1.5 配合 ViewRootImpl 工作
DecorView 与 ViewRootImpl 紧密协作。ViewRootImpl 负责管理视图的测量、布局和绘制过程,而 DecorView 作为视图树的根节点,会接收 ViewRootImpl 发起的这些操作请求,并将其递归传递给子视图。例如,ViewRootImpl 调用 DecorView 的 measure 方法,DecorView 会依次调用子视图的 measure 方法,从而完成整个视图树的测量。
小结
DecorView 作为 Activity 视图树的根节点,不仅承载系统界面元素,还关联 Window 和视图树,负责输入事件分发,并且与 ViewRootImpl 配合完成视图的测量、布局和绘制工作,在 Android 界面显示和交互中起着关键作用。
2. ViewRootImpl
是 Android 视图系统里的核心类,在视图的渲染、事件处理和窗口管理等方面起着关键作用。下面详细介绍其主要作用:
2.1 连接视图树和窗口系统
ViewRootImpl 是视图树和 WindowManagerService(WMS)之间的桥梁。每个 Activity 里的视图树都有一个对应的 ViewRootImpl 实例,它负责与 WMS 进行通信,将视图的状态和请求传递给系统窗口管理服务。
2.2 视图的测量、布局和绘制
测量(Measure):ViewRootImpl 会触发视图树的测量过程,调用 View 的 measure 方法,确定每个 View 的尺寸。通过递归调用子 View 的 measure 方法,最终确定整个视图树的大小。
布局(Layout):在测量完成后,ViewRootImpl 会调用 View 的 layout 方法,为每个 View 分配在父容器中的位置。同样通过递归调用子 View 的 layout 方法,完成整个视图树的布局。
绘制(Draw):布局完成后,ViewRootImpl 会触发视图树的绘制过程,调用 View 的 draw 方法,将视图绘制到 Surface 上。
2.3 处理输入事件
ViewRootImpl 负责接收来自系统的输入事件(如触摸、按键等),并将这些事件分发给视图树中的相应 View。它会根据事件的坐标和视图的位置,确定哪个 View 应该处理该事件,然后调用相应 View 的事件处理方法。
2.4 管理视图的生命周期
ViewRootImpl 会监听窗口的状态变化,如窗口的显示、隐藏、大小改变等,并根据这些变化触发视图树的重新测量、布局和绘制。例如,当窗口大小改变时,ViewRootImpl 会重新测量和布局视图树,以适应新的窗口尺寸。
2.5 同步 UI 线程和渲染线程
ViewRootImpl 会确保 UI 线程的操作与渲染线程的同步。在 Android 中,UI 操作

最低0.47元/天 解锁文章
576

被折叠的 条评论
为什么被折叠?



