HarmonyOS鸿蒙Next中Text组件如何设置每行展示几个字符并进行断行

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS鸿蒙Next中Text组件如何设置每行展示几个字符并进行断行 Text 组件,如何设置每行展示的字符个数

Text 每行展示字符为 7 个中文字符,一个汉字长度等于2个英文、数字、半角符号长度,等于1个全角符号

3 回复

demo如下:使用substring可以进行截断

@Entry
@Component
struct TextOverflowPage {
@State type: string = 'WordBreakType:Normal且clip为true'
@State text: string = 'This is set wordBreak to WordBreak text content This is set wordBreak to WordBreak text content.'
@State str: string = '测试测试测试测试巴黎巴黎'

build() {

  Text(this.str.substring(0, 7))

 }
}

可以参照一下案例:

首先使用measure.measureText()方法测量实际文本宽度,接着使用display.getAllDisplays()获取手机屏幕宽度,然后用“屏幕宽度 * 最大行数 * 组件宽度比例”的结果和“实际文本宽度”进行比较大小,判断是否需要“…”,点击…会展示全文;

当需要“…”时,只展示maxLines属性设置的固定高度的文本内容,当点击“…”时将该文本改成“…收起”并添加curves.springMotion曲线动画,同时在animateTo的显示动效的闭包函数中将maxLines属性值修改为-1使得该属性无效;

当需要“…收起”时,将collapseText的值改为“…”,并设置收起动画。如果您需要每行展示7个 中文字符,可以自己修改相关展示宽度及字体来达到自动换行的效果

import measure from '@ohos.measure'
import curves from '@ohos.curves';
import { BusinessError } from '@ohos.base';
import display from '@ohos.display';

@Entry
@Component
struct Index {
  // 长文本
  @State longMessage: string = "走在繁华的城市街头,明空感到无比紧张。他的心跳如雷鼓般擂动着胸膛,使得身上的伪装仿佛随时都要被揭开。然而,他仍然保持着冷静,凭借着过人的胆识与智慧,成功地躲过了敌人的层层封锁。\n\n  最终,明空来到了敌对帮派的老巢。此时此刻,那里的守卫正沉浸在欢庆的氛围中,丝毫没有察觉到即将来临的危机。明空深吸一口气,压抑住内心的激动,悄然潜入了这座古老的建筑。"
  //少于两行直接展示
  @State longMessage2: string = "  走在繁华的城市街头,明空感到无比紧张。他的心跳如雷鼓般擂动着胸膛,使得身上的伪装仿佛随时都要被揭开。然而,他仍然保持"
  // 最大显示行数
  @State lines: number = 2;
  // 长文本状态(展开 or 收起)
  @State collapseText: string = '...'
  // 屏幕宽度(单位px)
  screenWidth: number = 0;
  // 是否需要显示"展开"字样(注:当文本长度较短时就不需要“展开”)
  @State isExpanded: boolean = false
  // 测量文本宽度(单位px)
  @State textWidth: number = measure.measureText({
    textContent: this.longMessage,
    fontSize: 20
  })
  // 获取当前所有的display对象
  promise: Promise<Array<display.Display>> = display.getAllDisplays()

  aboutToAppear() {
    console.log(`文本宽度为:${this.textWidth}`)
    this.promise.then((data: Array<display.Display>) => {
      console.log(`所有的屏幕信息:${JSON.stringify(data)}`)
      //单位为像素
      this.screenWidth = data[0]["width"]
      // 屏幕宽度 * 最大行数 * 组件宽度比例 和 文字测量宽度
      this.isExpanded = this.screenWidth * this.lines * 0.4 <= this.textWidth
    }).catch((err: BusinessError) => {
      console.error(`Failed to obtain all the display objects. Code: ${JSON.stringify(err)}`)
    })
  }
  build() {
    Row() {
      Column() {
        if (this.isExpanded) {
          Stack({ alignContent: Alignment.BottomEnd }) {
            Text(this.longMessage)
              .fontSize(20)
              .fontColor(Color.Black)
              .maxLines(this.lines)
              .width("40%")
            Row() {
              Text(this.collapseText)
                .fontSize(20)
                .backgroundColor(Color.White)
            }
            .justifyContent(FlexAlign.End)
            .onClick(() => {
              if (this.collapseText == '...') {
                this.collapseText = '...收起';
                // 展开动画
                animateTo({
                  duration: 150,
                  curve: curves.springMotion(0.5, 0.8),
                }, () => {
                  this.lines = -1; // 使得设置的最大行属性无效
                })
              } else {
                this.collapseText = '...';
                // 收起动画
                animateTo({
                  duration: 100,
                  curve: Curve.Friction,
                }, () => {
                  this.lines = 2; // 只显示2行
                })
              }
            })
          }
        } else {
          Text(this.longMessage)
            .fontSize(20)
            .fontColor(Color.Black)
        }
      }
      .width('100%')
    }
    .height('100%')
  }
}

更多关于HarmonyOS鸿蒙Next中Text组件如何设置每行展示几个字符并进行断行的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,Text组件默认会根据内容自动换行。若需设置每行展示特定字符数并断行,可通过maxLinesellipsis属性控制行数及溢出处理,但无法直接设置每行字符数。如需精确控制每行字符数,可通过计算文本宽度并手动插入换行符实现,或使用自定义布局组件。具体实现需结合TextMetrics等API进行文本宽度测量。

在HarmonyOS鸿蒙Next中,Text组件默认会根据内容自动换行。如果需要控制每行展示的字符数并进行断行,可以通过设置maxLinestextOverflow属性来实现。例如:

Text('这是一段需要控制每行字符数的文本内容')
  .maxLines(2)  // 设置最大行数
  .textOverflow({overflow: TextOverflow.Ellipsis})  // 设置超出部分显示省略号

如果需要精确控制每行字符数,可以结合TextMetrics计算字符宽度,并通过手动插入换行符\n来实现断行。例如:

Text('这是一段需要精确控制每行字符数的文本内容\n这是第二行')

通过这种方式,可以灵活控制文本的展示效果。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!