Compose 是如何将数据转换成 UI 的?

这篇具有很好参考价值的文章主要介绍了Compose 是如何将数据转换成 UI 的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Compose 是一个声明式的 UI 框架,提供了很多开箱即用的组件,比如 Text()、Button、Image() 等等,Compose 会经过几个不同的阶段,最终渲染出 UI 界面。

此转换过程分为【三个阶段】

  1. 组合: 显示什么
  2. 布局: 放在哪里
  3. 绘制: 如何渲染

这三个阶段是逐一执行的,流程如下:

compse的图像渲染的底层原理,Jetpack Compose,android jetpack

组合阶段

在组合阶段,Compose 运行时会执行代码中定义的可组合函数,最终会生成一棵视图树。这个视图树由一个个布局节点(LayoutNode)组成。比如 Text()、Button() 都对应一个 LayoutNode,这些 LayoutNode 持有组件的所有信息。

compse的图像渲染的底层原理,Jetpack Compose,android jetpack

更形象一点的结构如下:
compse的图像渲染的底层原理,Jetpack Compose,android jetpack

这是一个非常简单的示例,但有时候我们定义的可组合项包含逻辑和控制流,而 Compose 会在不同状态的情况下生成不同的树。

布局阶段

布局阶段,对于视图树中的每个 LayoutNode 节点进行宽高尺寸测量并完成位置摆放,布局元素都会根据 2D 坐标来测量并放置自己及其所有子元素。

compse的图像渲染的底层原理,Jetpack Compose,android jetpack

其实 Compose 的布局阶段和传统的 View 系统很像(测量、布局、绘制),唯独多了一个“组合阶段”,而 Compose 把 测量和布局 统一放入了“布局阶段”

在布局阶段,使用以下 3 步算法遍历 LayoutNode 树:

  1. 测量子节点: 每一个节点会测量它的子节点,如果有的话。
  2. 决定自己的大小: 基于这些测量,节点决定自己的大小。
  3. 放置子节点: 每个子节点都相对于节点自身的位置进行放置。

布局阶段结束后,每个 LayoutNode 都将分配一个 宽度高度,以及一个应该绘制的 xy 坐标。

现在我们分析下面这个简单示例的布局流程。

compse的图像渲染的底层原理,Jetpack Compose,android jetpack

🔵 Row 测量其子项。

      🟢 首先,测量 Image。它没有任何子项,因此它决定自己的大小并将其报告给 Row。

      🟢 其次,测量 Column。它需要先测量自己的子项。

            🟠 第一个 Text 被测量。它没有任何子项,因此它决定自己的大小并将其报告给 Column。

            🟠 第二个 Text 被测量。它没有任何子项,因此它决定自己的大小并将其报告给 Column。

      🟢 Column 使用子测量值来决定自己的大小。它使用最大子宽度及其子项的高度之和。

      🟢 Column 将其子项放置在相对于自身的位置,将它们垂直放置在彼此下方。

🔵 Row 使用子尺寸来决定自己的尺寸。它使用最大子高度和子宽度的总和。然后它放置它的子项。

看到这,是不是发现个很牛逼的事? 我们只访问了每个节点一次。通过视图树的一次遍历,我们就可以测量和放置所有节点。这对性能来说就很重要了!当树中节点的数量增加时,遍历它所花费的时间只会以线性方式增加。相比之下,如果我们多次访问每个节点,遍历时间则会以呈指数级增加。

绘制阶段

绘制阶段,树中的每个节点都在屏幕上绘制其像素。

compse的图像渲染的底层原理,Jetpack Compose,android jetpack

上面我们说过,在布局阶段结束后,所有布局节点会得到它们的 宽度高度,以及 xy 坐标。所以现在就可以进入绘制阶段了。

绘制阶段会从上到下再次遍历树,每个节点依次在屏幕上绘制自己。

compse的图像渲染的底层原理,Jetpack Compose,android jetpack

首先 Row 将绘制它可能具有的任何内容,例如背景色。然后 Image 将绘制自己,然后是 Column,然后是第一个和第二个 Text。

Modifier 修饰符

上面我们给的简单代码示例都只是用了一些 Compose 提供给我们的现场的组件,实际开发过程中,会有一个大神级别一样的修饰符随处可见,它就是:Modifier 修饰符。

比如:Modifier.padding 是用来给组件设置边距的,它本质上是一个 LayoutModifier,而 LayoutModifier 会影响组件的测量和布局效果,会影响到组合项的整体 UI 效果。具体如何影响,这篇文章我们不讲它的深层次原理,而只是探讨思维模型。

所以,如果你想了解 LayoutModifier 的原理,可以阅读 聊聊 Jetpack Compose 原理 – LayoutModifier 和 Modifier.layout 这篇文章。

回到正题,如果我们加了 Modifier 修饰符,那么在最终生成的视图树中,可以将 Modifier 修饰符可视化为布局节点的包装节点:

compse的图像渲染的底层原理,Jetpack Compose,android jetpack

当我们链接多个修饰符时,每个修饰符节点包裹链的其余部分和其中的布局节点。 例如,当我们链接一个 clip 和一个 size 修饰符时,clip 修饰符节点包裹 size 修饰符节点,然后包裹 Image 布局节点。

这里你可能有疑问,为什么不是先 clip 然后 size,而是先 size 然后在 clip?看完 聊聊 Jetpack Compose 原理 – LayoutModifier 和 Modifier.layout 这篇文章你就懂了。

接着说,在布局阶段,我们用来遍历树的算法保持不变,但 每个修饰符节点也会被访问。这样,修饰符可以更改其包裹的 修饰符 或 布局节点 的 大小要求位置

如果我们看一下 Image 可组合项的实现(底层更细的实现),实际上可以看到它本身由包裹单个布局节点的修饰符链组成。类似地,Text 可组合项也是通过包含布局节点的修饰符链实现的。最后,Row 和 Column 的实现只是描述如何布置其子节点的布局节点:

compse的图像渲染的底层原理,Jetpack Compose,android jetpack

看不懂这张图?没事,这些细节原理都会有文章输出,比如我刚刚提到了两次的原理文章。文章来源地址https://www.toymoban.com/news/detail-828586.html

到了这里,关于Compose 是如何将数据转换成 UI 的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【教你两招!】弄懂3DMAX如何渲染通道图像

    3DMAX怎么渲染通道图? 在3dmax中有多种意义的通道,一般我们说的通道主要是应用在图像的后期处理中,可以减少重复渲染的工作量,提高图像的品质。在3dmax中如何渲染通道图像?这里,沐风老师为大家准备了两种通道图像渲染的方法,一起来看看吧! 3DMA 通道渲染方法一:

    2024年02月06日
    浏览(38)
  • C语言实现bmp图像底层数据写入与创建

    要用C语言实现bmp图像底层数据读写与创建,需要对bmp图像文件格式非常了解,如果不太熟悉bmp图像文件格式请先移步bmp图像文件格式超详解 创建bmp图像文件的方式有很多,比如用halcon,用qt,这些都是把已经画好的图像保存为bmp图像,有时候我们需要自己实现bmp图像底层数据

    2024年02月02日
    浏览(43)
  • CG MAGIC分享3d Max中的Corona渲染器材质如何成转换VRay材质?

    大家无论是使用Corona渲染器还是Vray渲染器时,进行材质问题时,都会遇到转化材质问题。 如何将CR转换成VR或者将VR转换CR材质呢? 对于这两者之间转换最好最好的方法只能是材质转换器。 CG MAGIC小编,梳理了两种方法,大家可以尝试以下两种尝试。 方法一、CR转VR材质的自带

    2024年02月10日
    浏览(45)
  • 【Unity每日一记】(Canvas的相机渲染模式) 如何将模型显示在UI之前

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity每日一记 ⭐【软件设计师高频考点暴击】 ⭐【Unityc#专题篇】之c#系统化大礼包】 ⭐【unity数据持久化】数据管理类_PlayerPrfs ⭐【u

    2024年04月09日
    浏览(50)
  • Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用

    正文 =============================================================== 后面的内容涉及到样式布局组件,内容比较多。 一、样式 在这里我们先进行样式的配置,打开ui.theme文件夹。 首先是修改Color.kt文件 val Blue200 = Color(0xFF979FF2) val Blue300 = Color(0xFF6D7DEA) val Blue700 = Color(0xFF0068C2) val Blue800 = Col

    2024年04月09日
    浏览(74)
  • Compose 自定义 - 数据转UI的三阶段(组合、布局、绘制)

    Compose 通过三个阶段把数据转化为UI:组合(要显示什么)、布局(要显示在哪里)、绘制(如何渲染)。 组合阶段 Compisition 界面首次渲染时会将可组合函数转化为一个个布局节点 Layout Node, 使用多叉树的数据结构构建一个UI树。 布局阶段 Layout 多叉树中父节点会测量他们的子

    2024年02月20日
    浏览(39)
  • 解决element ui大数据渲染表格时严重卡顿的问题

    element ui中的table表格组件在大量数据渲染的时候渲染会出现严重的卡顿问题,虽然网上也有很多解决方案,比如什么延迟加载,虚拟加载等等,这里为了避免走弯路,直接上终极解决方案大招:趁早换组件、马上换组件、现在就去换组件!!! 推荐组件:umy-ui 官方文档:u

    2024年03月17日
    浏览(55)
  • Android Compose 入门,深入底层源码分析

    我是跟着AS官网学习的,但是官方的教程写的不是很详细.官网链接 首先创建一个Compose项目,目录结构是这样: ui - theme - - Color.kt - - Theme.kt - - Type.kt MainActivity.kt 通过阅读源码,发现实际上还少了一个Shapes.kt,我手动添加了. 这个没什么好说的,官方的教程说的很明白了.这里简单贴一

    2024年04月10日
    浏览(53)
  • 如何在CentOS搭建docker compose ui可视化工具并无公网IP远程管理容器

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年03月22日
    浏览(55)
  • 如何在 Python 中将图像转换为 PDF

            如何使得图像转化成pdf文件, 想要将一个或多个图像转换为 PDF 文档?看看 img2pdf 和 PyPDF2 软件包就是您的最佳选择。         首先,您只需要一个 Python 环境,最好是 3.10 或更高版本。本教程中的代码是在使用 Python 3.10.12 的 Google Colab 环境中执行的。     

    2024年02月10日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包