鸿蒙next 多行文字加图片后缀实现方案

ops/2025/3/17 11:55:03/

需求

实现类似iOS的YYLabel之类的在文字后面加上图片作为后缀的样式,多行时文字使用…省略超出部分,但必须保证图片的展现。

系统方案

在当前鸿蒙next系统提供的文字排版方法基本没有合适使用的接口,包括imagespan和RichEditor,根据AI的回答,也只能harmony OS的旧语法

.textIndent(50.0)
.mode(textIndentMode.last_line)

实际该方法并不支持。

实现方案

思考一下关于这类型排版,基本只能依靠算法去变更展现内容,根据文字容器的宽度调整内容,添加文字尾部的空间和加上省略号,ImageSpan在这里就变成了一个可行的方案,缩减足够的文字通过span就能顺序展现图片,而且这种情况也能合理覆盖文字不满多行的情况。

代码实现

调整文本内容可以利用MeasureText from '@ohos.measure

  @Monitor('content')monitorContent() {let sliceContent:string = this.content;let flatContentWidth:number = px2vp(MeasureText.measureTextSize({textContent:sliceContent,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily}).width as number)let containerWidth = this.containerWidth;let leaveOutWidth = 30.0 + this.suffixSize.width;let flatContainerWidth = containerWidth * this.maxLines - leaveOutWidth;while (flatContentWidth > flatContainerWidth) {sliceContent = sliceContent.slice(0,sliceContent.length-1);flatContentWidth = px2vp(MeasureText.measureTextSize({textContent:sliceContent,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily}).width as number);}if (sliceContent.length < this.content.length) {sliceContent = sliceContent + "..."}this.showText = sliceContent;}

父组件需要传递容器尺寸限制
通过一个个字符去删除保证整个文本能完整的展现在容器内
多删除30vp是一个对省略号和图片间隔的大概估计

控件利用ImageSpan实现

Stack({ alignContent:Alignment.Bottom }) {Text() {Span(this.showText).fontSize(this.fontSize).fontWeight(this.fontWeight).fontFamily(this.fontFamily).lineHeight(this.lineHeight).fontColor(this.fontColor)ImageSpan(this.suffix).width(this.suffixSize.width).height(this.suffixSize.height).objectFit(ImageFit.Contain).verticalAlign(ImageSpanAlignment.CENTER).margin({left:4.0})}}.width('100%').height('100%')

使用span和imagespan的组合来保证图片紧贴文字之后

        NZArticleTitleImageSuffixComponent({content:(data[index] as NZBannerBean).title,fontSize:19.0,fontWeight:500,fontColor:$r('app.color.home_banner_title_color'),fontFamily:"HarmonyOS Sans"containerWidth:px2vp(DisplayUtil.getWidth())-54.0,lineHeight:26.0,maxLines:2.0,suffix:$r('app.media.nanlogo_red'),suffixSize:{width:20.0,height:20.0},suffixAlign:ImageSpanAlignment.CENTER

调用方传递文字容器的大小限制,内容,字体相关属性,行数限制,后缀图片,大小限制,对齐方式。

实际效果
两行限制超出容器
两行限制不超出容器


http://www.ppmy.cn/ops/166482.html

相关文章

电子元器件的假冒翻新防护

1.定义 假冒产品也称作仿制品、伪造产品或赝品&#xff0c;它被刻意隐瞒了真实身份,被当作真品出售。美国汽车工程师协会(SAE)给出了假冒伪劣电子元器件的定义:假冒伪劣电子元器件是指未经授权或许可的仿制品或替代品&#xff0c;或者是供应链中的供应商故意提供不符合原产品材…

数学建模历程之初见

第一次接触数学建模是在上大学前&#xff0c;当时只是听过。起源于我在大学的老乡群里聊天&#xff0c;由于当时年轻有点傻&#xff0c;说的话太多了&#xff0c;什么都问哈哈哈哈哈。 后来有个学长从老乡群里加我&#xff0c;问我怎么话那么多&#xff0c;你们懂当时对我幼小…

【unity】GPU顶点动画

unity顶点动画 工具篇模型合并生成动画数据工具调用&#xff1a;Shader处理 工具篇 模型合并 根据原模型创建预制件&#xff1a; 清理旧的合并结果&#xff0c;创建新容器对象 PS&#xff1a;注意 DestroyImmediate仅在 Editor 模式下有效&#xff0c;运行时需用Destroy var…

Android Room 框架领域层源码深度剖析(二)

一、引言 在 Android 开发的架构设计中&#xff0c;领域层&#xff08;Domain Layer&#xff09;扮演着至关重要的角色。它是应用程序的核心业务逻辑所在之处&#xff0c;负责处理业务规则、协调数据流动以及实现用例。Android Room 框架虽然主要聚焦于数据持久化&#xff0c;…

中考英语之07句子成分

在初中英语中&#xff0c;句子成分主要包括主语、谓语、宾语、表语、定语、状语、补语等。以下是对它们的详细介绍&#xff1a; 主语&#xff1a; 是句子所描述的对象&#xff0c;通常表示动作的执行者或被描述的主体。一般由名词、代词、数词、不定式、动名词或从句等充当。…

深入剖析 MetaSpace OOM 问题:根因分析与高效解决策略

目录 一、MetaSpace 区 OOM&#xff1a;概述 &#xff08;一&#xff09; MetaSpace的变革与挑战 &#xff08;二&#xff09;MetaSpace OOM的影响 &#xff08;三&#xff09; 为什么要关注MetaSpace OOM 二、MetaSpace 区 OOM的根本原因 &#xff08;一&#xff09;Met…

爬虫基础之爬取豆瓣同城信息(保存为csv excel 数据库)

网站:长沙最近一周戏剧活动_豆瓣 温馨提示: 本案例仅供学习交流使用 本案例所使用的模块 requests(发送HTTP请求)pandas(数据保存模块)lxml(用于解析数据模块)csv(用于保存为csv文件)pymysql(用于操作数据库)parsel(解析数据的模块) 确定爬取的信息内容&#xff1a; 戏剧的名称…

Linux中安装MySQL

检查是否有MySQL服务并卸载 检查并卸载 在安装MySQL数据库之前&#xff0c;我们需要先检查一下当前Linux系统中&#xff0c;是否安装的有MySQL的相关服务&#xff08;很多linux安装完毕之后&#xff0c;自带了低版本的mysql的依赖包&#xff09;&#xff0c;如果有&#xff0c…