HarmonyOS(29)onMeasureSize和PlaceChildren (View的测量和布局)
onMeasureSize和PlaceChildren
- onMeasureSize和PlaceChildren 说明
- 官方使用示例
- 参考资料
onMeasureSize和PlaceChildren 说明
在Android开发中View的测量onMeasure和布局onLayout是自定义组件必备的两个方法,HarmonyOS对自定义布局也提供了两个方法:
onMeasureSize:组件每次布局时触发,计算子组件的尺寸,其执行时间先于onPlaceChildren。注意 不允许在onMeasureSize函数中改变状态变量。

onPlaceChildren:组件每次布局时触发,设置子组件的起始位置。

两个方法的参数详细含义参考自定义组件的自定义布局
官方使用示例
以下示例中,Index页面包含一个实现了自定义布局的自定义组件,且对应自定义组件的子组件通过index页面内的builder方式传入。
而在自定义组件中,调用了onMeasureSize和onPlaceChildren设置子组件大小和放置位置。例如,在本示例中,在onMeasureSize中初始化组件大小size=100,后续的每一个子组件size会加上上一个子组件大小的一半,实现组件大小递增的效果。而在onPlaceChildren中,定义startPos=300,设置每一个子组件的位置为startPos减去子组件自身的高度,所有子组件右下角一致在顶点位置(300,300),实现一个从右下角开始展示组件的类Stack组件。
// xxx.ets
@Entry
@Component
struct Index {build() {Column() {CustomLayout({ builder: ColumnChildren })}}
}// 通过builder的方式传递多个组件,作为自定义组件的一级子组件(即不包含容器组件,如Column)
@Builder
function ColumnChildren() {ForEach([1, 2, 3], (index: number) => { // 暂不支持lazyForEach的写法Text('S' + index).fontSize(30).width(100).height(100).borderWidth(2).offset({ x: 10, y: 20 })})
}@Component
struct CustomLayout {@BuilderdoNothingBuilder() {};@BuilderParam builder: () => void = this.doNothingBuilder;@State startSize: number = 100;result: SizeResult = {width: 0,height: 0};// 第一步:计算各子组件的大小onMeasureSize(selfLayoutInfo: GeometryInfo, children: Array<Measurable>, constraint: ConstraintSizeOptions) {let size = 100;children.forEach((child) => {let result: MeasureResult = child.measure({ minHeight: size, minWidth: size, maxWidth: size, maxHeight: size })size += result.width / 2;})this.result.width = 100;this.result.height = 400;return this.result;}// 第二步:放置各子组件的位置onPlaceChildren(selfLayoutInfo: GeometryInfo, children: Array<Layoutable>, constraint: ConstraintSizeOptions) {let startPos = 300;children.forEach((child) => {let pos = startPos - child.measureResult.height;child.layout({ x: pos, y: pos })})}build() {this.builder();}
}
运行效果

参考资料
ConstraintSizeOptions
Measurable10+
自定义组件的自定义布局
自定义组件的自定义布局2
相关文章:
HarmonyOS(29)onMeasureSize和PlaceChildren (View的测量和布局)
onMeasureSize和PlaceChildren onMeasureSize和PlaceChildren 说明官方使用示例参考资料 onMeasureSize和PlaceChildren 说明 在Android开发中View的测量onMeasure和布局onLayout是自定义组件必备的两个方法,HarmonyOS对自定义布局也提供了两个方法: on…...
如何管理和维护组件库?
管理和维护组件库是一个关键的任务,因为它直接关系到产品的稳定性和功能的实现。以下是一些有效的方法来管理和维护组件库: 创建清晰的命名和文件结构:为每个组件分配一个有意义的名称,并根据功能和类型进行有层次的分类。确保文件…...
使用Python和wxPython将PNG文件转换为JPEG文件
简介: 在图像处理中,有时候我们需要将PNG格式的图像文件转换为JPEG格式。本篇博客将介绍如何使用Python编程语言和wxPython图形用户界面库,以及Pillow图像处理库来实现这一转换过程。通过本文的指导,您将学习如何快速将指定文件夹…...
spark的简单学习二
一 spark sql基础 1.1 Dataframe 1.介绍: DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表 格,除了数据以外,还掌握数据的结构信息,即schema。同时,与Hive类似,DataFrame也支 持…...
测试文章27-这是一篇测试文章请忽略
这是一篇测试文章请忽略 这是测试的文字,如有打扰请谅解。稍后测试完毕会删除 测试代码块 public static void main(String[] args){System.out.println("Hello, World!"); } aaa...
卡方分布和 Zipf 分布模拟及 Seaborn 可视化教程
卡方分布 简介 卡方分布是一种连续概率分布,常用于统计学中进行假设检验。它描述了在独立抽样中,每个样本的平方偏差之和的分布。卡方分布的形状由其自由度 (df) 参数决定,自由度越大,分布越平缓。 参数 卡方分布用两个参数来…...
音视频开发13 FFmpeg 音频 相关格式分析 -- AAC ADTS格式分析
这一节,我们学习常用的音频的格式 AAC,重点是掌握 AAC的传输格式 ADTS 头部的信息,目的是 : 当音频数据有问题的时候,如果是AAC的编码,在分析 头部信息的时候能够根据头部信息 判断问题是否出现在 头部。 A…...
周三晚19:00 | 数据资源入表案例拆解,他们如何应对入表难点?
数据资源入表的具体场景是怎样的?如何应对数据资源入表难点? 6月5日,即周三晚19:00,讲师-星光数智首席数据架构师 魏战松将继续带来关于《数据要素资产运营》的主题直播,为大家拆解数据资源入表的具体案例。 累计77…...
树的知识总结
一:树的基本术语(只写了查漏的部分 1 双亲:就是父节点 2 层序编号 3 有序无序树 4 森林 二:逻辑结构上与线性结构的比较 三:树的存储结构 ①双亲表示节点法:...
工业安全智勇较量,赛宁网安工业靶场决胜工业网络攻防对抗新战场
2024年1月30日,工信部发布《工业控制系统网络安全防护指南》(工信部网安〔2024〕14号),围绕安全管理、技术防护、安全运营、责任落实四方面提出安全防护要求,强调聚焦安全薄弱关键环节,强化技术应对策略&am…...
一种一维时间序列信号的广义小波变换方法(MATLAB)
地震波在含油气介质中传播时,其高频分量往往比低频分量衰减更快。据此,地震波的高频分量和低频分量之间的差异值可以用于分析含油气衰减位置,从而间接指示出含油气储层。对于时频域中的地震波衰减分析,一般地,利用地震…...
【GIC400】——驱动代码实现
文章目录 驱动代码实现IRQ 中断处理GIC 驱动GIC 使用使用示例系列文章 【ARMv7-A】——异常与中断 【ARMv7-A】——异常中断处理概述 【ARMv7-A】——进入和退出异常中断的过程 【GIC400】——PLIC,NVIC 和 GIC 中断对比 【GIC400】——GIC 简介 【GIC400】——GIC 相关的 CP1…...
如何在 Vue 组件中正确地使用 data 函数?
在 Vue 组件中正确使用 data 函数有以下几点需要注意: 返回一个对象: data 函数必须返回一个对象,这个对象包含了组件实例需要用到的所有数据属性。export default {data() {return {message: Hello, Vue!,count: 0}} }不要使用箭头函数: data 函数不应该使用箭头函数 () >…...
.Net 基于MiniExcel的导入功能接口示例
/// <summary>/// 导入/// </summary>/// <param name"formFile"></param>/// <returns></returns>[HttpPost("Import")]public async Task<ExecResult> Import(IFormFile formFile){try{if (formFile null) t…...
流量焦虑?别担心,Xinstall一站式App推广解决方案来了!
在移动互联网时代,App已经成为人们日常生活中不可或缺的一部分。然而,对于众多开发者来说,如何有效地推广自己的App,吸引更多的用户,却是一个不小的挑战。今天,我们将为大家介绍一款强大的App推广工具——X…...
降薪潮要开始了么?
互联网要全面迎来降薪潮了么,最近这个观念一直冲击着我 起因就是,前一段一位朋友降薪40%拿到了offer;还有一位金融机构的人力资源负责人朋友告诉我,最近来的很多互联网人都是降薪来的,普遍降30-50%不等 我就在想&…...
网络服务DHCP的安装
DHCP的安装 检查并且安装dhcp有关软件包 rpm -qc dhcp #检查是否存在dhcp yum install -y dhcp #进行yum安装查看系统的配置文件 切换到对应目录查看相关文件配置,发现是空目录。 将官方提供的example复制到原配置文件中 cp /usr/share/doc/dhcp-4.2.5/dhcpd.…...
SELinux:安全增强型Linux
SELinux:安全增强型Linux 作用: 可以保护linux系统的安全为用户分配最小的权限 状态: Enforcing:强制保护Permissive:宽松状态Disabled:禁用 为了安全性考虑,希望SELinux设置为Enforcing状态…...
.NET Redis限制接口请求频率 滑动窗口算法
在.NET中使用Redis来限制接口请求频率(每10秒只允许请求一次) NuGet setup StackExchange.Redis 实现速率限制逻辑: 在控制器或服务层中,编写Redis速率限制计数器。 设置Redis键: 为每个用户或每个IP地址设置一个唯一…...
Java List数据结构与常用方法
1.1 数据结构概述 Java的集合框架其实就是对数据结构的封装,在学习集合框架之前,有必要先了解下数据结构。 1.1.1 什么是数据结构 所谓数据结构,其实就是计算机存储、组织数据的方式。 数据结构是用来分析研究数据存储操作的,其实…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
