Android 图形系统之二:ViewRootImpl

news2024/12/4 14:32:42

ViewRootImpl简介

ViewRootImpl 是 Android UI 系统的核心类之一,负责将 View 层级树与窗口管理器 WindowManager 联系起来。它是Android 应用视图的根节点,与 WindowManager 结合,实现视图的绘制、事件分发、窗口更新等功能。虽然 ViewRootImpl 是一个内部类(非公开 API),但它在整个视图渲染管线中至关重要。

在这里插入图片描述图片参考自Android | 理解 ViewRootImpl

ViewRootImpl 的主要功能

  1. 管理视图层级树:
    • ViewRootImpl 是每个窗口视图树的根节点,负责承载整个 View 层级。
    • 通过 ViewRootImpl 的实例,DecorView(应用窗口的顶层视图)被添加到窗口管理器中。
  2. 事件分发:
    • 处理从系统窗口(如触摸屏、按键)到应用视图的输入事件。
    • 使用 dispatchInputEvent 将事件分发到具体的 View 节点。
  3. 视图的测量、布局和绘制:
    • 调用视图树的 measure、layout 和 draw 方法。
    • 基于 Choreographer 的帧同步机制,协调视图的刷新和绘制。
  4. 与 WMS(Window Manager Service)的通信:
    • ViewRootImpl 通过 WindowSession 和 Surface 与 WMS 交互,管理窗口生命周期、属性等。
  5. VSync 信号响应:
    • ViewRootImpl 利用 Choreographer 实现与屏幕刷新频率同步的绘制,提升绘制性能。
  6. 处理窗口焦点和输入法:
    • 控制焦点变化以及软键盘的弹出与收起逻辑。

核心组件与重要方法

核心字段
  • mView: 应用窗口的顶级视图(通常是 DecorView)。
  • mSurface: 用于呈现窗口内容的绘制表面。
  • mChoreographer: 帧调度器,协调 UI 绘制与 VSync 信号。
  • mWindowAttributes: 窗口属性,用于配置窗口特性(例如宽高、标志)。
重要方法

以下是一些关键方法的功能和简要介绍:

  1. setView(View view, WindowManager.LayoutParams attrs, View panelParentView)
    • 将视图层次结构与 ViewRootImpl 绑定,并传递窗口属性。
    • 执行视图树的首次测量、布局和绘制。
  2. performTraversals()
    • 核心的视图遍历方法,用于处理 measure、layout 和 draw。
    • 是三大过程的入口,被 Choreographer 触发。
  3. dispatchInputEvent(InputEvent event)
    • 输入事件分发入口,将事件传递给视图树中的具体 View。
  4. invalidate()
    • 通知 ViewRootImpl 某个区域需要重新绘制。
    • 最终触发绘制流程并更新 UI。
  5. requestLayout()
    • 请求重新布局,最终通过 performTraversals() 完成测量和布局。
  6. handleMessage(Message msg)
    • 作为 Handler 的核心实现,处理异步消息(如窗口更新、绘制等)。

ViewRootImpl 的生命周期

ViewRootImpl 的生命周期和窗口的生命周期紧密相关,以下是其主要阶段:

  1. 初始化:
    • 通过 WindowManager.addView() 创建 ViewRootImpl 并调用 setView() 绑定视图。
  2. 运行:
    • 根据系统的输入、刷新信号,持续处理消息和事件。
  3. 销毁:
    • 当窗口被移除时,ViewRootImpl 被销毁,并释放相关资源(如 Surface)。

ViewRootImpl 的绘制流程

  1. 输入事件(如点击屏幕)或刷新信号(如 invalidate())触发绘制。
  2. 调用 Choreographer.postFrameCallback() 注册下一帧回调。
  3. 在 VSync 信号到来后,触发 doFrame(),执行视图的 performTraversals()。
  4. 按以下顺序执行:
    • 测量(Measure): 计算每个视图的尺寸。
    • 布局(Layout): 确定每个视图的位置。
    • 绘制(Draw): 绘制视图内容到屏幕。

与开发的关系

虽然 ViewRootImpl 是隐藏 API,但了解其机制对于优化 UI 性能、定位渲染问题(如掉帧)非常重要。例如:

  • 分析过长的绘制时间:使用 Systrace 或 Perfetto 分析 performTraversals() 中的耗时部分。
  • 优化输入事件处理:确保 dispatchInputEvent 的处理逻辑高效,避免卡顿。

示例:窗口添加流程

以下为 ViewRootImplWindowManager 的关系示意代码:

// WindowManagerImpl 调用 addView()
public void addView(View view, ViewGroup.LayoutParams params) {
    ViewRootImpl root = new ViewRootImpl(context, display);
    root.setView(view, params, parentWindow);
}

addView() 被调用时,ViewRootImpl 负责绑定 DecorView,并触发绘制流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2253086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python通过ODBC连接神通数据库

1、安装神通数据库 2、安装python 3、安装pyodbc pip3 install pyodbc-5.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 注:pyodbc要和python版本相对应 4、安装unixodbc 5、配置神通数据库ODBC数据源 6、示例代码如下 #!/usr/bin/python…

基于单片机的智能药箱设计

本设计主要由红外检测传感器、显示、独立按键、舵机、语音以及短信等模块组成。红外传感器模块主要对药仓中的药物数据进行采集,采集完毕由主控制器进行数据加工,之后可传送至显示模块上进行显示,在显示模块也可对显示时间、吃药倒计时、吃药…

【掩体计划——DFS+缩点】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e5 10; vector<vector<int>> g; bool st[N]; int ans 1e9; bool dfs(int f, int u, int dis) {bool is 1;for (auto j : g[u]){if (j f)continue;is & dfs(u, j, dis (g[u].…

无人机点云处理算法技术解析!

一、核心技术 数据预处理&#xff1a; 数据预处理是点云处理的第一步&#xff0c;主要包括滤波、去噪、数据压缩等。滤波技术可以去除点云数据中的噪声和孤立点&#xff0c;提高数据质量。常用的滤波方法包括双边滤波、高斯滤波等。 数据压缩则用于减少数据量&#xff0c;提…

Android13 允许桌面自动旋转

一&#xff09;需求-场景 Android13 实现允许桌面自动旋转 Android13 版本开始后&#xff0c;支持屏幕自动旋转&#xff0c;优化体验和兼容性&#xff0c;适配不同屏幕 主界面可自动旋转 二&#xff09;参考资料 android framework13-launcher3【06手机旋转问题】 Launcher默…

vue+uniapp+echarts的使用(H5环境下echarts)

1.安装 npm install echarts4.9.0 --save // 带版本号 2.main.js中全局引用 // import echarts from echarts // 如果是5.0以上版本用这个 import * as echarts from echarts Vue.prototype.$echartsecharts 3.使用 <template><view id"box" style"w…

探索仓颉编程语言:官网上线,在线体验与版本下载全面启航

文章目录 每日一句正能量前言什么是仓颉编程语言仓颉编程语言的来历如何使用仓颉编程语言在线版本版本下载后记 每日一句正能量 当你被孤独感驱使着去寻找远离孤独的方法时&#xff0c;会处于一种非常可怕的状态。因为无法和自己相处的人也很难和别人相处&#xff0c;无法和别人…

【Elasticsearch】Docker安装和基本概念

1. Docker安装ES 拉取es镜像 docker pull elasticsearch:8.5.3 创建网络 docker network create oj-network 启动es docker run -d --name oj-es-dev -e "ES_JAVA_OPTS-Xms256m -Xmx256m" -e "discovery.typesingle-node" -v D:\javacode\oj-byte\depl…

基于Java Springboot环境保护生活App且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

[SWPUCTF 2021 新生赛]gif好像有点大

[SWPUCTF 2021 新生赛]gif好像有点大 帧解一下 找到这个二维码用软件CQR解开一下 得到flag NSSCTF{The_G1F_ls_T00_b1g} [BJDCTF 2020]base?? 给了我们base64加密的密文 用python直接解密 import base64 dict{0: J, 1: K, 2: L, 3: M, 4: N, 5: O, 6: x, 7: y, 8: U, 9: …

Unity类银河战士恶魔城学习总结(P156 Audio Settings音频设置)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了音频的大小设置与保存加载 音频管理器 UI_VolumeSlider.cs 定义了 UI_VolumeSlider 类&#xff0c;用于处理与音频设置相关的…

【Java从入门到放弃 之 类加载器】

类加载器 ClassLoader 类加载器动态加载类的两种方式类加载过程双亲委派模型特点类加载器层次结构 自定义类加载器总结 类加载器 类加载器负责将Java字节码文件&#xff08;.class文件&#xff09;动态加载到内存中&#xff0c;并将其转化为JVM可以执行的类对象。它是Java运行…

华为HarmonyOS 让应用快速拥有账号能力 -- 1 华为账号一键登录

概述 华为账号一键登录是基于OAuth 2.0协议标准和OpenID Connect协议标准构建的OAuth2.0 授权登录系统&#xff0c;应用可以通过华为账号一键登录能力方便地获取华为账号用户的身份标识和手机号&#xff0c;快速建立应用内的用户体系。 优势&#xff1a; 利用系统账号的安全…

高效数据分析:五款报表工具助力企业智能决策

概述 报表工具是企业进行数据分析、展示和决策支持的核心工具之一。本文将为大家介绍五款各具特色的报表工具&#xff0c;包括国产的山海鲸报表、FineReport&#xff0c;以及国际工具Databox、Pentaho Reporting和Zoho Analytics。通过详细分析它们的功能特点、优势和不足&…

生态环境一体化智慧监管平台

在数字化和智能化的浪潮中&#xff0c;生态环境保护与治理正迎来革命性的变化。生态环境一体化智慧监管平台的建设&#xff0c;不仅响应了这一趋势&#xff0c;而且为中国式现代化的生态治理提供了新的解决方案。本文将深度分析该平台的建设内容&#xff0c;探讨其在推动生态文…

基于PyTorch框架的线性回归实现指南

目录 ​编辑 1. 线性回归基础 2. PyTorch环境搭建 3. 数据准备 4. 定义线性回归模型 5. 损失函数和优化器 6. 训练模型 7. 评估模型 8. 结论 线性回归是统计学和机器学习中最基本的预测模型之一&#xff0c;它试图找到输入特征和输出结果之间的线性关系。在深度学习框…

重生之我在异世界学编程之C语言:深入指针篇(下)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 题集&#xff08;1&#xff09;指针笔试题1&a…

【HarmonyOS】鸿蒙应用地理位置获取,地理名称获取

【HarmonyOS】鸿蒙应用地理位置获取&#xff0c;地理名称获取 一、前言 首先要理解地理专有名词&#xff0c;当我们从系统获取地理位置&#xff0c;一般会拿到地理坐标&#xff0c;是一串数字&#xff0c;并不是地理位置名称。例如 116.2305&#xff0c;33.568。 这些数字坐…

SimpleLive1.7.5 |适配手机和TV,聚合抖B虎鱼四大直播

SimpleLive是一款聚合多个直播平台的应用程序&#xff0c;内置虎牙、斗鱼、哔哩哔哩及抖音直播。提供无广告体验&#xff0c;支持弹幕显示调整、夜间模式切换等功能。用户无需登录即可关注不同平台的主播并查看其直播状态。 大小&#xff1a;14M 下载地址&#xff1a; 百度网…

泷羽sec:shell作业

⼀、⽤Shell写⼀个计算器 #!/bin/bash read -p "请输入表达式&#xff08;格式为 操作数1 运算符 操作数2&#xff0c;如 5 3&#xff09;&#xff1a;" expression a1$(echo $expression | awk {print $1}) a2$(echo $expression | awk {print $2}) a3$(echo …