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

embedded/2025/3/15 6:53:26/

需求

实现类似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/embedded/172697.html

相关文章

idea超级AI插件,让 AI 为 Java 工程师

引言​ 用户可在界面中直接通过输入自然语言的形式描述接口的需求&#xff0c;系统通过输入的需求自动分析关键的功能点有哪些&#xff0c;并对不确定方案的需求提供多种选择&#xff0c;以及对需求上下文进行补充&#xff0c;用户修改确定需求后&#xff0c;系统会根据需求设…

鸿蒙初级考试备忘

Module类型 Module按照使用场景可以分为两种类型&#xff1a; Ability类型的Module&#xff1a; 用于实现应用的功能和特性。每一个Ability类型的Module编译后&#xff0c;会生成一个以.hap为后缀的文件&#xff0c;我们称其为HAP&#xff08;Harmony Ability Package&#x…

C++中通过虚函数实现多态的原理

C中通过虚函数实现多态的原理 我们都知道C是通过虚函数实现多态的&#xff0c;那么其中的原理是什么呢&#xff1f; 在C中&#xff0c;多态性是一种重要的特性&#xff0c;它允许通过基类指针或引用来调用派生类中的函数。多态性主要分为两种&#xff1a;编译时多态&#xff…

代码随想录 回溯

131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 这题挺难的&#xff0c;搞了两个小时才一知半解吧qaq 思路&#xff1a;首先要明白什么作为终止条件&#xff0c;其次就是for循环内什么时候插入path&#xff0c;剩下的就是套模板了&#xff0c;其次补充一下回文数的…

996引擎-自定义属性:配表 + 映射

996引擎-自定义属性:配表 + 映射 自定义属性ID范围200-399配属性表Mir200中做映射放到测试装备上编辑 tips 显示对自定义属性实现对原属性的加成效果,这个方案是最简单的。 如果要加更多的业务逻辑,则需要代码实现。 自定义属性ID范围200-399 配属性表 Envir\Data\cfg_att…

Netty基础—4.NIO的使用简介二

大纲 1.Buffer缓冲区 2.Channel通道 3.BIO编程 4.伪异步IO编程 5.改造程序以支持长连接 6.NIO三大核心组件 7.NIO服务端的创建流程 8.NIO客户端的创建流程 9.NIO优点总结 10.NIO问题总结 4.伪异步IO编程 (1)BIO的主要问题 (2)BIO编程模型的改进 (3)伪异步IO编程 …

智能制造:构筑网络新安全“智”造

在这个日新月异的数字化、网络化、智能化时代&#xff0c;信息安全不仅仅是一个简单的技术问题&#xff0c;更是企业业务管理的重要组成部分。对于智能制造企业而言&#xff0c;信息安全关乎的不仅是系统的稳定运行和数据的安全保护&#xff0c;更直接影响到企业的生产效率、运…

@Async 注解不生效的常见原因及解决方案

Async 注解不生效的常见原因及解决方案 1. 未启用异步支持 原因&#xff1a;Spring 默认不开启异步处理&#xff0c;需手动启用。 解决&#xff1a;在配置类上添加 EnableAsync 注解。 Configuration EnableAsync // 关键注解 public class AsyncConfig { }2. 方法调用方式错…