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

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

需求

实现类似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

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

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

相关文章:

  • goweb中文件上传和文件下载
  • [特殊字符] 深度实战:Android 13 系统定制之 Recovery 模式瘦身指南
  • 【Agent】OpenManus-Flow组件详细分析
  • PTA 7-12 排序
  • Linux 线程控制
  • VBA第二十六期 VBA用调试语句做进度条
  • 魔法协议Magic-MCP:开启AI智能体「万能互联」的新时代
  • 基于Yocto项目与SSD MobileNet的树莓派AI视觉系统构建指南*
  • 山东大学计算机组成与设计第五章习题解析
  • conda的基本使用及pycharm里设置conda环境
  • SpringData JPA事务管理:@Transactional注解与事务传播
  • Docker 镜像优化:如何避免重复安装软件,加速服务的构建与部署
  • 全面对比分析:HDMI、DP、DVI、VGA、Type-C、SDI视频接口特点详解
  • 3.水中看月
  • DeepSeek+Dify本地部署私有化知识库
  • node-sass替换成Dart-sass(全是坑)
  • [特殊字符]Windows 11 安装 Git 图文教程(含详细配置说明)
  • PTA7-13 统计工龄
  • 在 macOS 上优化 Vim 用于开发
  • 巴耶赫利专业俄语外贸网站建设
  • 企业网站php模板下载/网络营销渠道有哪些
  • 怎么把做的网页放入网站/seo渠道是什么意思
  • 长春南京小学网站建设/讯展网站优化推广
  • 企业官网设计/谷歌seo搜索引擎下载
  • 学校网站建设介绍范文/seo推广和百度推广的区别
  • 苏州新海通网站建设/广州百度首页优化