当前位置: 首页 > news >正文

Compose 自定义 - 数据转UI的三阶段(组合、布局、绘制)

一、概念

Compose 通过三个阶段把数据转化为UI:组合(要显示什么)、布局(要显示在哪里)、绘制(如何渲染)。

组合阶段

Compisition

界面首次渲染时会将可组合函数转化为一个个布局节点 Layout Node, 使用多叉树的数据结构构建一个UI树。

布局阶段

Layout

多叉树中父节点会测量他们的子节点,然后在一个二维空间里进行摆放。通过从上往下测量(如果存在子节点则测量子节点,测量完子节点后决定自身的尺寸)、从下往上摆放(根据子节点的尺寸摆放子节点)来决定该节点的宽高和坐标。

绘制阶段

Drawing

所有节点各自绘制自己在屏幕位置的像素。

二、举例

2.1 组合阶段 Compisition

每个 Composable 函数都会映射成UI树的 layout node 。这是一个很简单的例子,事实上 Composable 可以包含逻辑和控制流(if else, when...),在不同的状态下产生不同的UI树。

2.2 布局阶段 Layout

从上往下测量,从下往上摆放:

  1. 系统要求根节点 Row 测量自身。
  2. 根节点 Row 要求第一个子元素 Image 测量自身。
  3. 由于 Image 是叶子节点(没有子节点)能确定自身的尺寸和摆放并上报。
  4. 根节点 Row 要求第二个子元素 Column 测量自身。由于 Column 是分支节点(有子节点)需要先测量所有子元素来确定自身。
  5. 父容器 Column 要求第一个子元素 Text 测量自身。
  6. 由于 Text 是叶子节点能确定自身的尺寸和摆放并上报。
  7. 父容器 Column 要求第二个子元素 Text 测量自身。
  8. 由于 Text 是叶子节点能确定自身的尺寸和摆放并上报。
  9. 父容器 Column 所有子元素都测量摆放完毕,可以确定自身的尺寸和摆放并上报。
  10. 根节点 Row 所有子元素都测量摆放完毕,可以确定自身的尺寸和摆放。

2.3 绘制阶段 Drawing

同样地,UI树会自顶向下地遍历,每个节点依次在屏幕上绘制自身。首先Row会绘制它自己的内容如背景。然后 Image 绘制自身,再之后到分支节点Column,Column的第一个Text,Column的第二个Text。

三、Modifier

使用 Modifier 可以更改外观,当链式调用 Modifier 的时候会层层包裹前一个 Modifier 最里层是 Layout Node,详见:Modifier。

相关文章:

  • Mongodb 文本检索
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • html从零开始8:css3新特性、动画、媒体查询、雪碧图、字体图标【搬代码】
  • 【C语言】指针练习篇(下),深入理解指针---指针练习题【图文讲解,详细解答】
  • Python循环语句——for循环的嵌套使用
  • Java学习第十六节之创建对象内存分析和小结类与对象
  • Java实现停车场收费系统 JAVA+Vue+SpringBoot+MySQL
  • Godot 游戏引擎个人评价和2024年规划(无代码)
  • QtApplets-线程池
  • MinGW/MSYS/GCC/GNU/MSVC/Clang/LLVM都是什么
  • 防火墙HA详解
  • 问题:内存时序参数 CASLatency 是() #学习方法#微信#微信
  • 防御保护--内容安全过滤
  • C++ 音视频原理
  • 跟着pink老师前端入门教程(JavaScript)-day02
  • [deviceone开发]-do_Webview的基本示例
  • Apache Pulsar 2.1 重磅发布
  • eclipse(luna)创建web工程
  • extjs4学习之配置
  • Java多线程(4):使用线程池执行定时任务
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • k8s 面向应用开发者的基础命令
  • k8s如何管理Pod
  • Laravel 菜鸟晋级之路
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Protobuf3语言指南
  • Selenium实战教程系列(二)---元素定位
  • SOFAMosn配置模型
  • 二维平面内的碰撞检测【一】
  • 记一次和乔布斯合作最难忘的经历
  • 离散点最小(凸)包围边界查找
  • 力扣(LeetCode)22
  • 算法-插入排序
  • 正则表达式
  • 自制字幕遮挡器
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (Oracle)SQL优化技巧(一):分页查询
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (接口封装)
  • (离散数学)逻辑连接词
  • (六)vue-router+UI组件库
  • (六)激光线扫描-三维重建
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET : 在VS2008中计算代码度量值
  • .NET 5种线程安全集合
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET企业级应用架构设计系列之技术选型
  • @ResponseBody