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

鸿蒙中 文本测量

一、文本测量

文本测量指的是在图形绘制中,对文本的尺寸和布局进行评估,计算文本在给定字体和样式下占用的空间(例如宽度、高度和其他相关信息)的过程。

测量项说明
文本宽度测量给定文本在特定字体、大小和样式下的水平长度
文本高度测量给定文本的垂直高度,涉及文本的上升线、下降线等
行间距测量多行文本之间的垂直距离
字符间距测量单个字符之间的水平距离

文本测量用于文本排版、布局、渲染以及调整文本显示的位置和大小等场景,便于更精准地控制与调整界面的布局和呈现,以达到设计预期。

二、核心接口

接口描述
getLongestLine(): number获取当前段落最长行的宽度,建议使用时将返回值向上取整
getLongestLineWithIndent(): number获取当前段落最长行的宽度(包含当前行缩进的宽度),建议使用时将返回值向上取整
getTextLines(): Array<TextLine>获取当前段落文本行对象数组
getLineMetrics(): Array<LineMetrics>获取段落所有行的度量信息(高度、宽度、起始坐标等)
getLineMetrics(lineNumber): LineMetrics | undefined获取段落指定行的度量信息,超出范围返回undefined

三、开发步骤

3.1 导入依赖模块

import { text } from '@kit.ArkGraphics2D';

3.2 创建段落样式和段落生成器

// 设置文本样式 let myTextStyle: text.TextStyle = { color: { alpha: 255, red: 255, green: 0, blue: 0 }, fontSize: 100 }; // 创建一个段落样式对象,以设置排版风格 let myParagraphStyle: text.ParagraphStyle = { textStyle: myTextStyle, wordBreak: text.WordBreak.NORMAL }; // 创建一个段落生成器 let paragraphBuilder = new text.ParagraphBuilder(myParagraphStyle, new text.FontCollection());

3.3 添加文本并生成段落

// 在段落生成器中设置文本样式 paragraphBuilder.pushStyle(myTextStyle); // 在段落生成器中设置文本内容 paragraphBuilder.addText("文本测量测试"); // 通过段落生成器生成段落 let paragraph = paragraphBuilder.build();

3.4 排版并获取测量信息

// 对段落进行塑形排版,设置排版宽度为1000 paragraph.layoutSync(1000); // 1. 获取排版后最长行行宽 let longestLineWidth = paragraph.getLongestLine(); console.info("longestLineWidth = " + longestLineWidth); // 2. 获取排版后最长行行宽(包含缩进) let longestLineWithIndentWidth = paragraph.getLongestLineWithIndent(); console.info("longestLineWithIndentWidth = " + longestLineWithIndentWidth); // 3. 获取排版后所有行对象 let textLines = paragraph.getTextLines(); for (let index = 0; index < textLines.length; index++) { const textline = textLines[index]; let curLineRange = textline.getTextRange(); let curLineGlyCnt = textline.getGlyphCount(); console.info("MetricsMSG: 第" + (index + 1) + "行 TextRange start: " + curLineRange.start + " end: " + curLineRange.end); console.info("MetricsMSG: 第" + (index + 1) + "行字形数量为: " + curLineGlyCnt); } // 4. 获取排版后指定行对应的度量信息 let lineCnt = paragraph.getLineCount(); for (let index = 0; index < lineCnt; index++) { let lineMetrics = paragraph.getLineMetrics(index); if (lineMetrics) { console.info("MetricsMSG: 第" + (index + 1) + "行 width: " + lineMetrics.width); console.info("MetricsMSG: 第" + (index + 1) + "行 start index: " + lineMetrics.startIndex + ", end index: " + lineMetrics.endIndex); } } // 5. 获取排版后所有行度量信息数组 let allLineMetrics = paragraph.getLineMetrics(); console.info("MetricsMSG: 第1行 lineMetrics width: " + allLineMetrics[0].width);

五、接口使用场景

接口使用场景
getLongestLine()确定段落最大宽度,用于容器适配
getLongestLineWithIndent()考虑缩进的宽度计算
getTextLines()获取每行的文本范围和字形数量
getLineMetrics()获取所有行的详细度量信息
getLineMetrics(lineNumber)获取指定行的详细度量信息

六、注意事项

6.1 排版宽度设置

// 必须先调用layoutSync设置排版宽度,再进行测量 paragraph.layoutSync(1000); // 设置排版宽度为1000px

6.2 行号有效性

getLineMetrics(lineNumber)中,lineNumber从0开始计数,超出当前段落排版后最大行数后返回undefined

http://www.cnnetsun.cn/news/2009415.html

相关文章:

  • 避坑指南:Three.js 贴图动画做流光效果时,offset重复计算的常见问题与修复
  • Gemini3.1Pro推理能力全面爆发2026实测与选型指南
  • Wand-Enhancer:免费解锁WeMod Pro高级功能的终极完整指南
  • 华为OD机试真题 新系统 2026-04-19 JavaGo 实现【8位LED控制器】
  • 2026最权威的六大AI辅助论文工具横评
  • 思源黑体TTF:15分钟构建专业级多语言字体解决方案
  • Vivado高效工作流搭建指南:如何管理IP核、约束文件与Block Design复用
  • Real Anime Z开发者指南:CUDA碎片治理与CPU卸载机制详解
  • 别再被‘kernel source tree not found’卡住:一份给Linux新手的RPM包依赖关系排查指南
  • AI-Agent工具调用实战
  • CV炼丹新思路:用CBAM注意力机制让你的小模型在Kaggle竞赛里也能“卷”赢大模型
  • SpringBoot监听Redis键过期事件,实现订单超时自动关闭(附集群版避坑指南)
  • Hypnos-i1-8B实际作品:百度知道TOP10数学问题全自动解答(含markdown表格)
  • 别再只测TCP了!用iperf3的UDP模式给你的网络做个‘压力体检’(附丢包率与抖动分析指南)
  • 只需要一条命令,让所有 AI 应用工具共享 skills
  • 除了蓝桥杯,还有哪些能写进简历的硬核电子竞赛?附各赛事企业命题(华为/平头哥/TI)解析
  • 旧Mac升级指南:三步解锁苹果官方限制,让老设备运行最新macOS系统
  • 三步解锁RPG Maker加密资源:无需编程的浏览器解密工具全攻略
  • 小红书批量下载神器XHS-Downloader:一键获取无水印内容的终极指南
  • 告别Flutter打包APK的玄学报错:用`-vv`参数揪出真凶(附常见错误文件列表)
  • Zotero Citation终极指南:三步告别文献引用噩梦,让学术写作效率飙升90%
  • 3大实战技巧揭秘:douyin-downloader无水印批量下载全流程方案
  • APP签名验证全栈破解:Frida Hook绕过+算法逆向+Python一键调用(附可运行脚本)
  • 从微信工作群到专属内网IM,企业迁移时最容易忽略哪些管理成本
  • 用2美元的Attiny85芯片DIY一个USB键盘:手把手教你玩转Digispark(附完整代码)
  • 避坑指南:YOLOv3模型量化时,你的200张样本图片真的准备对了吗?
  • 终极魔兽争霸III优化指南:让经典游戏在现代电脑上完美运行
  • mysql如何通过调整临时表空间配置优化查询_优化innodb_temp_data_file_path
  • 告别信号完整性问题:Allegro 16.6约束规则管理器(Constraint Manager)从入门到精通配置指南
  • 告别手动启动:用NSSM把任意EXE程序变成Windows开机自启服务(附.NET Core实战)