HarmonyOS 鸿蒙Next Text获取每行数据宽度

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

HarmonyOS 鸿蒙Next Text获取每行数据宽度 有一段文本在Text中显示 , 显示了多行,如何获取每行的文本宽度呢?

Android有以下相关方法:

  • getLayout().getLineEnd(index) //获取指定行的偏移索引
  • getLayout().getLineWidth(index)//获取指定行的宽度

鸿蒙中有类似的api吗?

2 回复

目前鸿蒙没有直接方法获取,可以参考下这个demo,使用onAreaChange获取高度,使用measure计算每行文本宽度

import measure from '@ohos.measure'

@Entry
@Component
struct Page49 {
  private INITIAL_LINE_HEIGHT: number = -1;
  @State private textContent: string = '';
  @State private displayedLines: number = 0;
  @State private textWidth: string = '0';
  @State private textHeight: string = '0';
  @State lineIndexArr: number[] = [0];
  @State lineContentArr: string[] = [''];
  @State sliceContent: string = '';

  build() {
    Column() {
      Button('添加文字').onClick(() => {
        this.textContent += '测' + parseInt(String(Math.random()*1000))+'试'; // 添加一个“测试”至文本内容
      })
      Button('删除文字').onClick(() => {
        if (this.textContent.length > 0) { // 确保文本非空才执行删除
          this.textContent = this.textContent.slice(0, -1); // 删除最后一个字符
        }
      })
      Button('获取每行文本内容').onClick(()=>{
        this.lineIndexArr = [0];
        this.lineContentArr = [''];
        this.sliceContent = '';
        const count = this.textContent.length;
        const textSize = measure.measureTextSize({
          textContent: this.textContent,
        })
        const textContentWidth = measure.measureText({
          textContent: this.textContent,
        })
        this.sliceContent = this.sliceContent || this.textContent;
        for (let iLine=0;iLine<this.displayedLines;iLine++){
          this.sliceContent = this.sliceContent.slice(this.lineIndexArr[iLine]);
          const content = this.sliceContent;
          console.log(content,'content')
          const currentContentWidth = measure.measureText({
            textContent: content
          });
          if(px2vp(currentContentWidth) < Number(this.textWidth)){
            this.lineContentArr.push(content);
            this.lineIndexArr.push(1);
            break;
          }
          content.split('').forEach((v:i,number)=>{
            const widthPre = measure.measureText({
              textContent: content.slice(0,i),
            })
            const widthAft = measure.measureText({
              textContent: content.slice(0,i+1),
            })
            if(Number(this.textWidth) > px2vp(widthPre) && Number(this.textWidth) < px2vp(widthAft)){
              const currentContent = content.slice(0,i)
              this.lineContentArr.push(currentContent);
              this.lineIndexArr.push(i);
            }
          })
          console.log('this.lineContentArr',this.lineContentArr.toString())
          console.log('this.lineIndexArr',this.lineIndexArr.toString())
        }
      })
      Text(`当前行数: ${this.displayedLines}`)
      Text(`文本宽度: ${this.textWidth}`);
      Text(`文本高度: ${this.textHeight}`);
      Text(this.textContent)
        .width('50%')// 设置文本宽度为50%
        .onAreaChange((previousArea: Area, currentArea: Area) => {
          if (this.INITIAL_LINE_HEIGHT == -1 && this.INITIAL_LINE_HEIGHT === this.INITIAL_LINE_HEIGHT && currentArea.height > 0) {
            this.INITIAL_LINE_HEIGHT = currentArea.height as number;
          }
          console.log('Previous Height:', previousArea.height);
          console.log('Current Height:', currentArea.height);
          console.log('this.INITIAL_LINE_HEIGHT:', this.INITIAL_LINE_HEIGHT);
          this.displayedLines = Math.ceil(currentArea.height as number / this.INITIAL_LINE_HEIGHT);
          this.textWidth = currentArea.width as string;
        })
      ForEach(this.lineContentArr,(item:string,index: number)=>{
        Text(`第${index}行文本内容:${item}`).fontColor(Color.Green)
      })
    }
    .width('100%')
  }
}

更多关于HarmonyOS 鸿蒙Next Text获取每行数据宽度的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,若你想获取每行文本的宽度,可以通过鸿蒙提供的文本绘制API来实现。鸿蒙系统提供了丰富的UI框架和图形绘制能力,其中Text组件和相关绘制方法可以帮你完成这个任务。

要获取每行文本的宽度,通常你需要:

  1. 创建Text组件:首先,你需要有一个Text组件,该组件包含了你要测量的文本内容。

  2. 使用Layout测量:鸿蒙的Layout类提供了测量文本尺寸的方法。你可以通过调用Text组件的measureText方法来获取文本的宽度和高度。但这个方法通常返回的是整个文本的尺寸,不是每行的尺寸。

  3. 手动换行计算:为了获取每行的宽度,你可能需要手动处理换行逻辑。根据文本的字体大小、行高和容器的宽度,计算文本在特定宽度下每行的内容,并使用measureText方法测量这些内容的宽度。

  4. 考虑文本样式:文本的样式(如字体大小、加粗等)会影响其实际显示的宽度,因此在测量时需要考虑到这些因素。

由于鸿蒙系统API可能随着版本更新而变化,具体实现细节建议参考最新的鸿蒙开发文档。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部