HarmonyOS(29)onMeasureSize和PlaceChildren (View的测量和布局)

onMeasureSize和PlaceChildren

  • onMeasureSize和PlaceChildren 说明
  • 官方使用示例
  • 参考资料

onMeasureSize和PlaceChildren 说明

在Android开发中View的测量onMeasure和布局onLayout是自定义组件必备的两个方法,HarmonyOS对自定义布局也提供了两个方法:
onMeasureSize:组件每次布局时触发,计算子组件的尺寸,其执行时间先于onPlaceChildren。注意 不允许在onMeasureSize函数中改变状态变量。
在这里插入图片描述

onPlaceChildren:组件每次布局时触发,设置子组件的起始位置。
在这里插入图片描述
两个方法的参数详细含义参考自定义组件的自定义布局

官方使用示例

以下示例中,Index页面包含一个实现了自定义布局的自定义组件,且对应自定义组件的子组件通过index页面内的builder方式传入。

而在自定义组件中,调用了onMeasureSizeonPlaceChildren设置子组件大小和放置位置。例如,在本示例中,在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

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

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

相关文章

面试题:谈谈你对 JS 内存泄漏与内存溢出的理解

面试题&#xff1a;谈谈你对 JS 内存泄漏与内存溢出的理解 内存泄漏&#xff08;Memory Leak&#xff09;指的是程序不需要使用的内存没有被正确释放&#xff0c;从而导致内存占用逐渐增加&#xff0c;最终可能会耗尽所有可用内存。 内存泄漏即不想用的内存没被释放 内存溢出&a…

【VSCode实战】转换大小写快捷键

今天在VSCode Insiders上编码&#xff0c;突然想将某常量转换为大写。按照virtual studio的习惯&#xff0c;我Ctrl Shift U没有效果&#xff0c;Ctrl U也没效果。网上搜了搜&#xff0c;原来VSCode Insiders没有这个默认功能。 而VSCode Insiders这么强大怎么可能没有大小…

ELK 使用 metricbeat监控数据

IP功能版本192.168.140.153elk-18.13.4192.168.140.153metricbeat8.13.4192.168.140.156elk-28.13.4192.168.140.156metricbeat8.13.4192.168.140.159logstash8.13.4192.168.140.159kibana8.13.4 一、安装ELK 参考文档&#xff1a; https://download.csdn.net/download/weix…

TG-5510CA温补晶振用于GPS应用

随着现代社会对精准定位和导航需求的不断增加&#xff0c;GPS&#xff08;全球定位系统&#xff09;已成为我们日常生活和各行各业中不可或缺的一部分。无论是在智能手机、汽车导航、无人机飞行控制&#xff0c;还是在精密的科学研究和军事应用中&#xff0c;GPS系统都扮演着至…

爬虫入门教程:爬虫概述

在数字化时代&#xff0c;数据已经成为我们生活和工作中不可或缺的一部分。而如何高效、准确地获取这些数据&#xff0c;成为了许多领域面临的共同问题。今天&#xff0c;我们就来一起探讨一下爬虫技术&#xff0c;这个能够自动从互联网上抓取信息的神奇工具。 一、什么是爬虫…

Android电量优化,让你的手机续航更持久

节能减排&#xff0c;从我做起。一款Android应用如果非常耗电&#xff0c;是一定会被主人嫌弃的。自从Android手机的主人用了你开发的app&#xff0c;一天下来&#xff0c;也没干啥事&#xff0c;电就没了。那么他就会想尽办法找出耗电量杀手&#xff0c;当他找出后&#xff0c…

Ambient Diffusion: Learning Clean Distributions from Corrupted Data

我们采用以下六个标准,用于对从损坏数据中学习的领域的研究进行分类: **学习范式:**该标准区分模型如何从数据中学习: 监督学习,如 Noise2Noise [39] 所示,涉及在损坏和干净图像对上训练模型。这种方法需要访问干净的数据,这可能并不总是可行的。无监督学习方法,如 Amb…

用户定制应用顺序

经常会有这样的个性化需求&#xff0c;用户希望可以在页面上按自己的偏好拖放移动应用图标&#xff0c;而且还能保存&#xff0c;下次访问该页面时应用图标就是按自己上次保存的顺序展示的。 拖放是一种常见的特性&#xff0c;即抓取对象后移动到另一个位置后放下。在 HTML5 中…

CentOS 7基础操作10_Linux备份与恢复文档

在Linux 操作系统中&#xff0c;最简单的文件和目录备份工具就是cp (复制&#xff09;命令&#xff0c;但是当需要备份的文件、目录数量较多时&#xff0c;仅仅使用cp 命令就显得“力不从心”&#xff0c;并且备份的文件数量及其所占用的磁盘空间都可能会对服务器产生不小的压力…

PPT设置为本框的默认格式以及固定文本框

调整文本框固定位置 双击文本框之后勾选如下三个位置 设置文本框为默认 在调整好文本框的基本性质后&#xff0c;设置为默认即可

python-验证子串

题目描述 输入两个字符串&#xff0c;验证其中一个串是否为另一个串的子串。 输入两个字符串&#xff0c; 每个字符串占一行&#xff0c;长度不超过200且不含空格。 输出 若第一个串s1是第二个串s2的子串&#xff0c;则输出(s1) is substring of(s2)否则&#xff0c;若第二个串…

什么是实际嵌入表示和虚拟嵌入表示?

在知识图谱中&#xff0c;实体和关系通常被表示为向量空间中的点或向量&#xff0c;这些向量被称为嵌入表示。嵌入表示的目的是将实体和关系映射到连续的向量空间中&#xff0c;以便计算机可以更好地理解它们之间的语义关系。在这种情况下&#xff0c;可以将嵌入表示分为实际嵌…

pgvector v0.7.0 的新增功能

现实世界的嵌入数据集通常包含隐藏在向量空间中的冗余。例如&#xff0c;当向量聚集在多维空间中的某些中心点周围时&#xff0c;它会揭示一个可利用的结构。通过减少这种冗余&#xff0c;我们可以在对精度影响最小的情况下节省内存和性能。自 0.7.0 版以来&#xff0c;pgvecto…

【原创】win虚拟机克隆,没有esxi、VMware、Hyper-V和VirtualBox,只知道win系统的账号和密码能不能把系统克隆出来

迁移 Windows 系统的虚拟机(Virtual Machine, VM)涉及几个步骤,以确保虚拟机在迁移后能够正常工作。以下是迁移过程的一般步骤: 1. 准备工作 备份数据:在迁移之前,确保已经备份了虚拟机内的重要数据,以防迁移过程中出现意外情况。检查兼容性:确保目标主机的虚拟化平台…

Linux环境下安装MySQL详细教程(手把手附图安装!!!)

目录 一、前言 二、安装前的环境检查 三、下载官方的 MySQL 安装包 四、开始安装 MySQL 五、尝试初次启动 MySQL 六、给MySQL 做一些简单的小配置 七、共勉 一、前言 本次专题将带大家进入一个新的专题 ---- MySQL。作为本次专题的第一篇博客&#xff0c;肯定是带大家一起…

Jetson Orin Nano v6.0 + tensorflow2.15.0+nv24.05 GPU版本安装

Jetson Orin Nano v6.0 tensorflow2.15.0nv24.05 GPU版本安装 1. 源由2. 步骤2.1 Step1&#xff1a;系统安装2.2 Step2: nvidia-jetpack安装2.3 Step3&#xff1a;jtop安装2.4 Step4&#xff1a;h5py安装2.5 Step5&#xff1a;tensorflow安装2.6 Step6&#xff1a;jupyterlab安…

Golang——RPC

一. RPC简介 远程过程调用(Remote Procedure Call&#xff0c;RPC)是一个计算机通信协议。该协议运行运行于一台计算机的程序调用另外一台计算机的子程序&#xff0c;而程序员无需额外的为这个交互作用编程。如果涉及的软件采用面向对象编程&#xff0c;那么远程过程调用亦可称…

Thesios: Synthesizing Accurate Counterfactual I/O Traces from I/O Samples——论文泛读

ASPLOS 2024 Paper 论文阅读笔记整理 问题 在设计大规模分布式存储系统时&#xff0c;I/O活动的建模至关重要。具有代表性的/O跟踪&#xff0c;可以对现有硬件、配置和策略进行详细的性能评估。假设跟踪进一步支持分析假设情况&#xff0c;例如部署新的存储硬件、更改配置和修…

QT解析JSON格式超简单

目录 还是从最基础开始、什么是JSON 一、只解析json 1..解析JSON的主要类 2.主函数 二、解析并利用结构体存储 1.定义结构体 2.从 JSON 解析并填充结构体 实战示例 还是从最基础开始、什么是JSON JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数…

2.4 OpenCV随手简记(五)

一、图像翻转 第一个图像翻转&#xff0c;这个可是制作表情包的利器。 图像翻转在 OpenCV 中调用函数 flip() 实现&#xff0c;原函数如下&#xff1a; flip(src, flipCode, dstNone) src&#xff1a;原始图像。 flipCode&#xff1a;翻转方向&#xff0c; 如果 flipCode 为…