HarmonyOS 鸿蒙Next中text文本溢出自定义

HarmonyOS 鸿蒙Next中text文本溢出自定义

cke_216.png

有一个text()其内容是如上的的一段多行文本,到底有几行每行多长未知,每行最长刚好占满容器宽度

如何在最后一行的省略号处(即文本溢出省略号)加一个可点击的文字按钮,如展开收起等


更多关于HarmonyOS 鸿蒙Next中text文本溢出自定义的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

【背景知识】

文本折叠与展示的设计模式广泛应用于多个场景,主要通过隐藏非关键信息提升界面简洁性,同时允许用户主动展开查看细节。

典型场景如下:

  • 长文档阅读:在处理长而复杂的文档时,用户可以通过折叠除关注部分以外的所有内容,使文档更加简洁易读。
  • 信息展示平台:在信息展示平台如新闻网站、博客或论坛中,文本折叠可以让用户先看到摘要或概要,感兴趣时再展开详细内容。

maxLines:用于设置文本的最大行数,默认情况下,文本是自动折行的,如果指定此属性即可实现文本的折叠。

[@ohos.measure](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-measure):可以计算文本的高度和宽度,截取文本来实现文本的折叠。

【解决方案】

方案一:使用maxLines属性实现,当文本收起时,通过设置maxLines=-1即可实现文本的展开;当文本展开时,通过设置maxLines=2即可实现文本的收起,限制行数为2行(可根据需要设置不同行数)。

完整代码示例如下:

// 收起文本显示行数
const COLLAPSE_LINES: number = 2;
const FONT_SIZE: number = 15;
const ELLIPSIS: string = '...';
const EXPAND_TEXT: string = '展开';
const COLLAPSE_TEXT: string = '收起';
const FULL_TEXT: string =
  'This is the setting of textOverflow to Clip text content This is the setting of textOverflow to None text content. This is the setting of textOverflow to Clip text content This is the setting of textOverflow to None text content.'

@Entry
@Component
struct expandCollapse {
  @State suffixStr: string = EXPAND_TEXT;
  @State longMessage: string = FULL_TEXT;
  @State lines: number = COLLAPSE_LINES;
  controller: TextController = new TextController()

  build() {
    Scroll() {
      Column() {
        Stack({ alignContent: Alignment.BottomEnd }) {
          Text(undefined, { controller: this.controller }) {
            Span(this.longMessage)
          }
          .fontSize(FONT_SIZE)
          .maxLines(this.lines)

          Row() {
            Row() {
              Text(this.suffixStr == EXPAND_TEXT ? ELLIPSIS : '')
              Text(this.suffixStr)
                .fontSize(FONT_SIZE)
                .fontColor(Color.Orange)
            }
            .backgroundColor(Color.White)
          }
          .justifyContent(FlexAlign.End)
          .onClick(() => {
            if (this.suffixStr == EXPAND_TEXT) {
              this.suffixStr = COLLAPSE_TEXT;
              // 使得设置的最大行属性无效
              this.lines = -1;
            } else {
              this.suffixStr = EXPAND_TEXT;
              this.lines = COLLAPSE_LINES;
            }
          })
        }
        .margin({ top: 100, left: 8, right: 8 })
      }
    }
  }
}

方案二:使用[@ohos.measure](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-measure)计算文本总体的高度和文本收起的高度,并通过截取文本来实现展开收起效果,详情可参考文字展开收起案例

【常见FAQ】

Q:展开收起效果比较突兀,有优化效果么? A:可以在点击时添加animateTo动画。

Q:如何设置文本过长时自动截断? A:可以通过textoverflow属性设置自动截断,文本截断规则可以通过wordBreak设置。

更多关于HarmonyOS 鸿蒙Next中text文本溢出自定义的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这样试试呢

Stack() {
  Text(this.longText)
    .maxLines(this.isExpanded ? undefined : 3)
    .textOverflow({ overflow: TextOverflow.Ellipsis })
    .onAreaChange((_, newArea) => {
      // 判断是否需要显示按钮
    })

  if (this.showExpandButton) {
    Button(this.isExpanded ? '收起' : '展开')
      .position({ x: '90%', y: this.isExpanded ? '100%' : 'calc(100% - 24px)' })
      .onClick(() => { this.isExpanded = !this.isExpanded })
  }
}

Row() { Text() { Span(‘我是Text我是Text我是Text我是Text我是Text我是Text我是Text我是Text我是Text我是Text我是Text我是Text我是Text’) Span(‘展开’) } .padding(10) .borderWidth(1) } .width(‘100%’)

使用Text和span,第一个span的内容通过js截图,截取一定数量就可以,没必要显示省略号了,因为有展开和收起了,同时通过字数也可以控制是否显示展开是收起男牛

官方的文字折叠案例,

https://gitee.com/harmonyos_samples/TextExpand

同时建议找Deep应用问一下,我用的元宝,开发过程挺多场景给的挺好

用这个api计算文本的宽度,超出自身宽度省略。需要省略时写一个二分循环遍历查找 截取的文本+ 省略号 + 按钮宽度 <= 文本容器宽度

cke_134.png

在HarmonyOS Next中处理Text文本溢出,可以使用TextOverflow属性配合maxLines实现。若需自定义,可通过Text组件的overflow属性设置TextOverflow.EllipsisTextOverflow.Clip等基础效果。对于更复杂的自定义(如展开/收起),需结合@State变量控制文本显示状态,通过条件渲染动态切换完整文本与截断文本。布局约束需明确宽度或弹性容器(如Flex)。示例代码片段:

@Entry
@Component
struct MyComponent {
  @State isExpanded: boolean = false

  build() {
    Column() {
      Text(this.isExpanded ? longText : shortText)
        .maxLines(this.isExpanded ? undefined : 2)
        .textOverflow({ overflow: TextOverflow.Ellipsis })
        .onClick(() => { this.isExpanded = !this.isExpanded })
    }
  }
}

在HarmonyOS Next中实现Text组件最后一行的溢出省略号处添加可点击按钮,可以通过以下方式实现:

  1. 使用Text组件的overflow属性设置为TextOverflow.Ellipsis实现文本截断
  2. 结合Row容器和Text组件组合实现

示例代码:

Row() {
  Text(this.textContent)
    .overflow({ overflow: TextOverflow.Ellipsis })
    .maxLines(3) // 设置最大行数
    .layoutWeight(1) // 占据剩余空间
    
  Text("展开")
    .fontColor(Color.Blue)
    .onClick(() => {
      // 展开逻辑
    })
}

关键点说明:

  1. 使用Row容器水平排列文本和按钮
  2. 通过layoutWeight让文本组件自适应剩余宽度
  3. 当文本超过maxLines设置时,会自动显示省略号
  4. 点击事件绑定在"展开"文本上

注意事项:

  1. 需要确保Row容器的宽度足够显示完整内容
  2. 可以通过state变量控制展开/收起状态
  3. 动态切换maxLines值来实现展开/收起效果

这种实现方式相比自定义布局更简单高效,利用了HarmonyOS的现有组件能力。

回到顶部