View那些事儿(1) -- View绘制的整体流程

2023-11-07

写在开头:Android的知识体系十分庞大,在Android的学习道路上难免会遇到学习了新东西就忘了旧东西的情况,本系列文章主要是对自己对View的学习过程进行一个深入的理解与总结,当然还结合自己在实际项目中的一些体会写了一些东西。

当用户打开你写出的App的时候,第一眼关注到的是整个界面,而不是功能,所以要想吸引住用户,就必须写出一个好看的界面。好在Android提供了一套强大的绘图体系,让我们可以自由发挥,绘制出形形色色的View,从而构成丰富多彩的界面。不过要想掌握绘图技巧,就必须掌握View的工作原理,我们就从View的最基本的原理开始探索吧。
先来看看一个窗口由那些部分组成的:
Android窗口的组成

接着解释一下这些View的意义:

  • PhoneWindow:将Decoriew设置为整个应用窗口的根View,是Window的实现类,它是Android中的最基本的窗口;
  • DecorView:又叫顶级View,系统会将要显示的具体内容呈现在PhoneWindow上。一般情况下,它的内部会包含一个竖直方向的LinearLayout,在这个layout中有两个部分:title和content,DecorView可以通过 View view = getWindow().getDecorView()获得。它还是PhoneWindow与ViewRoot之间的桥梁,ViewRoot会通过DecorView设置窗口属性;
  • DecorView中的TitleView:标题栏,一般指的是toolbar。
  • DecorView中的ContentView:内容栏,是一个id为content的Framelayout,我们平时所写的setContentView()其实就是在设置它。

上面提到了ViewRoot,那么ViewRoot又是什么呢?
我们要知道,View的绘制有三大流程:measure(测量)、layout(布局)、draw(绘制),其中measure用来测量view的宽和高,layout用来确定view在父容器中位置,而draw则负责将view绘制在屏幕上。这里的三大流程均是通过ViewRoot来完成的,ViewRoot的实现类是ViewRootImp。在ActivityThread中,当Activity对象被创建完毕后,会将DecorView添加到Window中,同时创建ViewRootImp对象,并将ViewRootImp和DecorView建立关联,源码中中片段如下:

root = new ViewRootImp(view.getContext(),display);
root.setView(view,wparams,panelParentView);

View的绘制流程是从ViewRoot的performTraversals()方法开始的,其过程如下图所示:

performTraversals的工作流程

performTraversals()会依次调用performMeasure、performLayout和performDraw,这三个方法分别完成以上三大流程,例如performMeasure会调用measure方法,measure方法中又会调用onMeasure方法,在onMeasure方法中会对所有子view进行measure过程,子view再重复此过程,如此反复就实现了view树的遍历。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

View那些事儿(1) -- View绘制的整体流程 的相关文章

  • 致命异常:Google 地图 V2 中的 GLThread、StackOverflowError

    我正在实施 Google 地图 V2 并利用从外部 GPX 文件接收的交付路线 设备路径 设备当前位置和交付点位置 问题是它大多数时候都有效 我收到的错误 当它不起作用时 是下一个 03 16 20 48 37 811 I dalvikvm
  • Android 中的列表视图到 pdf

    我有一个自定义列表视图 我想从整个列表视图制作pdf 我参考了很多帖子并实现了下面的代码 该代码将我的列表视图转pdf 但问题是它不包含整个列表视图项目 pdf 中仅提供前几项 我的转换函数列表视图转pdf is fab setOnClic
  • 在 Android 中从互联网链接获取数据

    我正在制作一个带有 URL 的应用程序 asp 扩展名 我们向其传递所需的参数并使用 POST 方法获取一些字符串结果 关于如何实现这一目标有什么建议吗 UPDATED 实际上我有一个 net 链接 它接受一些 POST 参数并给我一个结果
  • 收到“提供的 API 密钥已过期”。使用 Places API 时出错

    我已经从 Google 控制台为 Places API 密钥生成了服务器密钥 但每当我访问该服务时 我都会收到 提供的 API 密钥已过期 错误 我已尝试重新生成密钥 但仍然出现相同的错误 我遇到了同样的问题 但终于解决了 Google 地
  • android新手需要了解“?android:attr/actionBarSize”

    我正在经历拉尔斯 沃格尔的教程 http www vogella com articles AndroidFragments article html在使用 Fragments 时 我遇到了以下代码 android layout margi
  • Android 服务 START_STICKY START_NOT_STICKY

    我需要让我的服务始终在后台运行 并使用 startService 函数启动我的服务 无论应用程序的状态如何 我都不想重新启动服务 这是我的观察 START STICKY gt 如果应用程序启动 则服务正在重新启动 当应用程序关闭时 服务也会
  • Android 应用程序主活动出现 ClassNotFoundException

    大多数设备都可以运行我的应用程序 但我收到此错误报告 java lang RuntimeException Unable to instantiate activity ComponentInfo com company app com c
  • 在 BigQuery 视图中找不到字段

    这可能只是 BQ 中的一个错误 但也许有人可以指出我的一些错误 本质上我想做的是添加一个字段 比如new field 到一个表并将其保存为视图以便稍后查询 当我查询视图时 它会抛出一个关于无法找到该视图的错误new field 复制此错误的
  • 意图过滤器到底是什么?

    我读过很多关于意图过滤器的文章 但我真的无法理解它们到底是做什么的 那么 如果有人可以用一个清晰 的例子向我解释意图过滤器的作用到底是什么 thanks 我认为这是有据可查的here http developer android com g
  • Android 上 Java 库中的代码出现 NoClassDefFoundError

    我的用户经常遇到错误 应用程序在启动期间崩溃 当应该加载 MainActivity 时 VM 显然找不到该类 我不明白为什么 该应用程序的架构是 我的免费版和专业版都使用一个通用项目 不知道是否相关 请参阅下面的堆栈跟踪 有什么想法吗 ja
  • android device.getUuids 返回 null

    我正在尝试使用低功耗蓝牙 BLE 通过 Android 应用程序连接到 Arduino Uno 我正在 Android Studio 上进行开发 使用 Samsung Galaxy S4 和 Android 版本 5 0 1 进行测试我点击
  • 如何更改蜂窝中儿童偏好屏幕的背景颜色

    过去几天我一直在寻找解决方案 但找不到 我需要更改右窗格的背景颜色 我知道如何更改左父首选项的颜色 我在清单文件中创建了一个新主题
  • 可下载字体例外

    我决定使用可下载字体 https developer android com guide topics ui look and feel downloadable fonts html在我的项目中 IS 按照指南中的建议实施了所有内容 当我
  • 谷歌的Json解析Gson库:JsonElement和JsonObject有什么区别?

    public abstract class JsonElement extends Object 表示 Json 元素的类 它可以是 JsonObject JsonArray JsonPrimitive 或 JsonNull public
  • 特定铃声 firebase 通知 xamarin.android

    How i can force the push notification to run ringtone instead of default notification sound is there any way to ovveride
  • 当应用程序从最近的应用程序中滑动时,前台服务会被终止,通知也会被删除

    我有一个foreground service有通知 当应用程序从最近的应用程序托盘中滑出时 服务将被终止 通知也会被删除 这是我的服务的代码VoiceService class Override public IBinder onBind
  • 我在 ClearCase 中的快照视图消失了,如何恢复它们?

    我的机器上有 3 个视图 我可以看到 Windows 目录上的结构 但现在当我打开 ClearCase 时 我在 ClearCase Navigator 上看不到其中任何一个 我该如何添加它们 最干净的解决方案 转到 shell 会话中这些
  • 如何在不下载子项的情况下从 Firebase 获取子项密钥?

    我有一个 Firebase 数据库 其中的节点 items 有很多子项 我想导入子项键的列表 由于每个子项都包含相当多我对此不感兴趣的数据 因此我想仅下载子项密钥 以最大程度地减少传输的数据量 为了便于说明 假设我有以下数据结构 然后我想获
  • 如何在 Android 的应用程序中使用 LDAP 身份验证?

    我想在我们的应用程序中添加 LDAP 身份验证 我在 Github 上搜索并找到了两个应用程序 但它们无法连接到服务器 通过ldap连接服务器的必要条件是什么 查看 UnboundID SDK 他们有一个适用于 Android 的套件 该应
  • 找不到与给定名称“@style/Theme.AppCompat.Light”匹配的资源

    我已经研究这个问题几个小时了 从 github 下载存储库后 任何 xml 文件中的唯一错误是 No resource found that matches the given name style Theme AppCompat Ligh

随机推荐

  • 实践教程|使用Stable Diffusion图像修复来生成自己的目标检测数据集

    作者丨R dig par Gabriel Guerin 来源丨AI公园 深度学习模型需要大量的数据才能得到很好的结果 目标检测模型也是一样 要训练一个YOLOv5的模型来自动检测你最喜欢的玩具 你需要拍几千张你的玩具在不同上下文中的照片 对
  • er图的主键外键_卓象科技:MYSQL外键的优缺点

    MYSQL外键是什么 定义 外键是相对于主键说的 是建立表之间联系的必须的前提 例如 这里有两张 user 用户 表和qx 权限 表 user中gid是用户权限id 而gid是依赖于qx中的id 那么qx中的id就是user的外键 也就是当
  • Java增强for循环(学习笔记)

    Java增强for循环 主要用于数组或者集合的增强型for循环 格式 for 声明语句 表达式 代码句子 声明语句 声明新的局部变量 该变量的类型必须和数组元素的类型匹配 其作用域限定在循环语句块 其值与此时数组元素的值相等 表达式 表达式
  • pycharm配置python路径_pycharm如何配置python环境

    pycharm配置python环境的方法是 1 依次点击 File Project Interpreter 2 点击 Show All 选择 Existing Environment 3 选择python的安装路径 点击OK即可 配置方法
  • 安装secureCRT提示sorry的解决办法

    摘自 你的secureCRT还在sorry吗 作者 丶PURSUING 发布时间 2021 03 12 08 21 37 网址 https blog csdn net weixin 44742824 article details 1146
  • WinCE5.0中文模拟器SDK(VS2005)的配置

    WinCE5 0中文模拟器SDK的安装过程不细说了 一路默认即可 下面主要介绍如何配置 使其能在VS2005中正常使用 安装完成后 打开VS2005 点击菜单 工具 选项 设备工具 设备 选择 Windows CE 5 0 ARMV4I E
  • Keil报错:Libraries\CMSIS\stm32f10x.h(298): error: #67: expected a "}"

    原因主要有三点 启动文件 头文件定义 驱动选择不一致 各项如下 1 启动文件 2 头文件定义 3 驱动选择 会导致报错的情况案例 1 启动文件为startup stm32f10x md s C C 的Define为 STM32F10X HD
  • moose安装过程中遇到问题及解决方案

    问题 curl 56 OpenSSL SSL read error 0A000126 SSL routines unexpected eof while reading errno 104 解决方案 未使用vpn 下载速度慢 可多次执行命令
  • [Unity3d]3D项目转换为VR项目(暴风魔镜SDK)

    使用暴风魔镜SDK来操作 将魔镜的摄像头拖放到项目中 将MoJingVrHead的Script剪切到CamRoot中 这个时候能看到显示2个物体了 不过使用的Canvas还是显示一个 调整Canvas的属性 使其显示2份 步骤一 将Rend
  • Linux下杀死指定命令进程

    ps grep cat awk F print 1 xargs kill 9 执行如下 在网上搜到其他不一样的方式 也在此贴一下 https www jianshu com p 80b141746fae
  • 深入理解JS闭包

    关于JS中闭包的理解 相信很多人都和笔者一样刚开始很是困惑 笔者也是在看了很多前辈的文章后 总结出一点自己的理解 记录与此 囿于笔者水平有限 若有错误之处 恳请不啬赐教 你可以在一个函数里面嵌套另外一个函数 嵌套 内部 函数对其容器 外部
  • Windows电脑怎么设置局域网内共享磁盘?

    前言 我有一台主机硬盘容量比较大 想做为一个共享硬盘 方便我其他笔记本能够往这台硬盘传输文件 想到的最好最快的方法就是通过局域网内部进行文件传输 通过局域网共享磁盘 这种方法也是非常便捷的 那如何设置操作呢 请详细看下文 局域网共享磁盘 共
  • 用QEMU虚拟国产飞腾+麒麟环境

    1 简述 由于调试 测试需要飞腾主机及麒麟的环境 但是飞腾主机资源有限 于是便尝试了下在Qemu下虚拟出来一个ARM主机用来作为测试环境 本文介绍如何在Qemu虚拟的ARM环境下安装麒麟操作系统 2 安装过程 2 1 准备 本次安装需要准备
  • 什么是分布式系统?

    分布式系统是由多个独立的计算机或计算节点组成的系统 这些节点通过消息传递或共享数据的方式进行协调和通信 以实现共同的目标 分布式系统的设计目标是提高系统的可靠性 可扩展性 性能和容错性 在一个分布式系统中 各个计算机节点之间相互合作 共同完
  • .NET Framework简介

    1 什么是 NET Framework NET Framework 是支持生成 运行下一代应用程序和XML Web Services的内部Windows组件 它简化了在高度分布式Internet环境中的应用程序开发 NET Framewor
  • python之数值类型数据及运算

    数据类型 数据类型分为 字符串 str 整型 int 浮点型 float 负数 complex 布尔型 bool 一 字符串 1双引号 单引号括起来的 2双引号开头 结尾 xxx 3单引号开通 结尾 xxx 4不能一边单一边双 5多行字符串
  • iOS 为app生成下载链接,并生成二维码

    1 打开这个网址 http aso100 com 在此处输入app名称 点搜索 2 看 第一个就是我们的app 下一步点击图标 3 点击app id 4 看连接出来了 5 最后到这个网站生成二维码 http 2bai com cn hao2
  • Vue2中使用高德地图(Loader )

    1 需求 根据输入的地址 地图显示地址的位置 2 准备工作 2 1 注册高德开放平台账户 并完成认证 根据具体实际情况 完成个人开发或者企业开发认证 高德开放平台https console amap com 2 2在应用管理 我的应用中添加
  • 斗地主老输?只能领低保?看我用Python写一个AI出牌器!现在一亿欢乐豆了!

    前言 最近在网上看到一个有意思的开源项目 快手团队开发的开源AI斗地主 DouZero 今天我们就一起来学习制作一个基于DouZero的欢乐斗地主出牌器 看看AI是如何来帮助我们斗地主 赢欢乐豆 实现财富自由的吧 首先一起来看看AI斗地主出
  • View那些事儿(1) -- View绘制的整体流程

    写在开头 Android的知识体系十分庞大 在Android的学习道路上难免会遇到学习了新东西就忘了旧东西的情况 本系列文章主要是对自己对View的学习过程进行一个深入的理解与总结 当然还结合自己在实际项目中的一些体会写了一些东西 当用户打