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

HarmonyOS 6 ArkTS 自定义布局:判断子组件是否参与布局计算使用文档

文章目录核心价值核心原理判断子组件是否参与布局代码核心逻辑解析判断子组件是否参与布局1. 关键标记位2. 测量阶段判断是否参与尺寸计算onMeasureSize3. 布局阶段判断是否正常摆放onPlaceChildren核心API1. 子组件测量相关2. 子组件布局相关3. 布局约束常量总结核心价值精准控制子组件**测量measure与布局layout**生命周期空间不足时自动过滤子组件提升页面渲染效率完全自主决定子组件显示/隐藏不受默认布局规则限制核心原理判断子组件是否参与布局在自定义布局中子组件是否显示由两个阶段共同决定测量阶段onMeasureSize判断子组件是否计入容器尺寸、是否参与宽度/高度累加布局阶段onPlaceChildren判断子组件是正常摆放还是移至屏幕外隐藏两个阶段通过标记位overFlowIndex联动实现“超出即隐藏”的效果。代码// xxx.ets Entry Component struct Index { build() { Column() { CustomLayout({ builder: ColumnChildren }) } .justifyContent(FlexAlign.Center) .width(100%) .height(100%) } } Builder function ColumnChildren() { ForEach([1, 2, 3], (item: number, index: number) { // 目前不支持使用lazyForEach语法。 Text(S item) .fontSize(20) .width(60 10 * index) .height(100) .borderWidth(2) .margin({ left:10 }) .padding(10) }) } Component struct CustomLayout { // 只布局一行如果布局空间不够的子组件不显示的demo。 Builder doNothingBuilder() { }; BuilderParam builder: () void this.doNothingBuilder; result: SizeResult { width: 0, height: 0 }; overFlowIndex: number -1; onPlaceChildren(selfLayoutInfo: GeometryInfo, children: ArrayLayoutable, constraint: ConstraintSizeOptions) { let currentX 0; let infinity 100000; if (this.overFlowIndex -1) { this.overFlowIndex children.length; } for (let index 0; index children.length; index) { let child children[index]; if (index this.overFlowIndex) { // 如果子组件超出父组件范围将它布局到较偏的位置达到不显示的目的。 child.layout({x: infinity, y: 0}); continue; } child.layout({ x: currentX, y: 0 }) let margin child.getMargin(); currentX child.measureResult.width margin.start margin.end; } } onMeasureSize(selfLayoutInfo: GeometryInfo, children: ArrayMeasurable, constraint: ConstraintSizeOptions) { let width 0; let height 0; this.overFlowIndex -1; // 假定该组件的宽度不能超过200vp也不能超过最大约束。 let maxWidth Math.min(200, constraint.maxWidth as number); for (let index 0; index children.length; index) { let child children[index]; let childResult: MeasureResult child.measure({ minHeight: constraint.minHeight, minWidth: constraint.minWidth, maxWidth: constraint.maxWidth, maxHeight: constraint.maxHeight }) let margin child.getMargin(); let newWidth width childResult.width margin.start margin.end; if (newWidth maxWidth) { // 记录不该布局的组件的下标。 this.overFlowIndex index; break; } // 累积父组件的宽度和高度。 width newWidth; height Math.max(height, childResult.height margin.top margin.bottom); } this.result.width width; this.result.height height; return this.result; } build() { this.builder() } }运行效果如图核心逻辑解析判断子组件是否参与布局1. 关键标记位overFlowIndex: number -1;作用记录第一个溢出子组件的下标规则下标 ≥ overFlowIndex 的子组件 →不参与布局、直接隐藏下标 overFlowIndex 的子组件 →正常测量、正常摆放2. 测量阶段判断是否参与尺寸计算onMeasureSize核心目标计算总宽度判断子组件是否会超出容器若超出则标记截断位置。设置最大布局宽度maxWidth 200vp遍历子组件依次测量尺寸 外边距累加宽度如果超过限制记录当前下标为overFlowIndex终止遍历后续子组件不再参与尺寸计算最终容器尺寸 所有“允许显示”的子组件总宽度此阶段决定哪些子组件会占用容器空间。3. 布局阶段判断是否正常摆放onPlaceChildren核心目标根据测量阶段的标记正常摆放或隐藏子组件。遍历所有子组件如果子组件下标 ≥overFlowIndex溢出项使用child.layout({x: 100000, y: 0})将其移至屏幕外达到视觉隐藏效果如果子组件下标 overFlowIndex正常从左到右布局累加宽度 边距此阶段决定哪些子组件会在屏幕上可见。核心API1. 子组件测量相关API作用child.measure(constraint)执行子组件测量获取宽高结果child.getMargin()获取子组件外边距left/right/top/bottommeasureResult.width/height测量完成后子组件实际占用尺寸2. 子组件布局相关API作用child.layout({x, y})设置子组件最终显示坐标超大坐标隐藏x:100000移至屏幕外实现隐藏3. 布局约束常量let maxWidth Math.min(200, constraint.maxWidth as number);自定义布局最大宽度优先遵守自定义限制 父容器约束总结不支持 LazyForEach自定义布局内只能使用ForEach不能使用懒加载列表语法。隐藏≠销毁移至屏幕外的子组件仍存在节点树只是不可见。margin必须参与计算子组件外边距会占用布局空间计算总宽度时必须包含。测量与布局必须配对onMeasureSize与onPlaceChildren必须使用同一个标记位保证显示一致性。隐藏位置建议使用超大坐标如 100000隐藏避免使用 0/-9999 造成意外显示。如果这篇文章对你有帮助欢迎点赞、收藏、关注你的支持是持续创作的动力
http://www.gsyq.cn/news/1354513.html

相关文章:

  • Navicat16/17 Mac版试用期终极重置指南:三种自动化方案实现无限免费使用
  • 从零打造可落地的直流电机 PID 驱动系统 (八):蓝牙差分 OTA 升级,传输速度提升 10 倍以上
  • Proxmox VE ARM64实战:在树莓派和ARM服务器上部署企业级虚拟化平台
  • 写给前端的 CANN-asnumpy:昇腾原生NumPy到底是啥?
  • 【Qt学习】信号槽
  • 2026大竹县黄金回收避坑指南;闲置黄金变现;认准铭润金银回收,诚信靠谱 - 亦辰小黄鸭
  • C++图文并茂轻松进阶面向对象
  • STM32CubeMX与Keil RTX中断优先级冲突解决方案
  • 义乌GEO优化公司哪家靠谱?拒绝转包套路,4个维度精准筛选优质服务商(2026年5月最新) - GEO排行榜
  • 2026大足县黄金回收避坑指南;闲置黄金变现;认准铭润金银回收,诚信靠谱 - 亦辰小黄鸭
  • DownKyi完整指南:如何轻松下载B站8K超高清视频的终极教程
  • Topit 技术深度:macOS窗口层级管理的现代SwiftUI实现与架构解析
  • 嘉兴黄金回收门店避坑指南 六家靠谱店铺推荐 优选长悦 - 专业黄金回收
  • 微信PC端二维码刷新机制深度解析:心跳、状态与逆向定位
  • ncmdumpGUI:一键解密网易云音乐NCM文件,让音乐重获自由
  • 2026年成都公司注销代办费用是多少? - 品牌推荐官方
  • 如何用Python轻松读取通达信数据:Mootdx完整指南
  • 详解Linux文件操作知识点
  • 终极指南:如何在Windows上轻松读写Btrfs文件系统
  • CVE-2026-20223深度解析:Cisco零信任平台满分漏洞,未认证API一键接管全局
  • 机器人任务级迭代学习控制技术解析与应用
  • Office RibbonX Editor:重塑Microsoft Office界面定制的终极免费工具
  • 同样是写毕业论文,为什么有人神速定稿,有人越写越崩?
  • JBoss JMXInvokerServlet反序列化漏洞深度解析
  • 如何5分钟打造Zotero中文文献管理终极方案:茉莉花插件完全指南
  • ppInk:Windows上最强大的免费屏幕标注工具终极指南
  • 终极Galgame翻译方案:如何免费畅玩日语视觉小说
  • 香城人力资源服务选购指南,实力与口碑兼具的选择 - mypinpai
  • 2026年AI智能算力服务研究报告:HBM、CPO与重构|附240+份报告PDF、数据、可视化模板汇总下载
  • Unity UGUI循环列表实战:SuperScrollView高性能滚动优化指南