HarmonyOS 鸿蒙Next 使用Flex布局和onAreaChange事件计算并记录多行文本位置的实现方案

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

HarmonyOS 鸿蒙Next 使用Flex布局和onAreaChange事件计算并记录多行文本位置的实现方案

class PosItem {
  x: number
  y: number

  constructor(x: number, y: number) {
    this.x = x
    this.y = y
  }
}

@Entry
@Component
struct Page021 {
  // 原始数据
  @State historyValueArr: Array<string> = ['张三', '李四', '举头望明月', '低头思故乡', 'HarmonyOS', '不可能,绝对不可能', '张三和李四', 'city不city']
  @State result: string[][] | undefined = undefined
  private map: Map<string, PosItem> = new Map<string, PosItem>()

  processPositions(key: string, value: PosItem) {
    this.map.set(key, value)
    if (this.map.size == this.historyValueArr.length) {
      this.convertTo2DArray()
    }
  }

  convertTo2DArray() {
    console.info('创建一个空的对象来存储行数据');
    const rows: ESObject = {};

    this.map.forEach((value, key) => {
      const rowKey = Math.floor(value.y / 26.923076923076923).toString();
      if (!rows[rowKey]) {
        rows[rowKey] = [];
      }
      rows[rowKey].push(key);
    });

    // 对每一行中的元素按x值排序
    Object.keys(rows).forEach(rowKey => {
      rows[rowKey].sort((a: string, b: string) => {
        const posA = this.map.get(a);
        const posB = this.map.get(b);
        return posA!.x - posB!.x;
      });
    });

    this.result = Object.values(rows);
  }

  build() {
    Column() {
      Flex({
        direction: FlexDirection.Row,
        wrap: FlexWrap.Wrap,
      }) {
        ForEach(this.historyValueArr, (item: string, value: number) => {
          Text(item)
            .padding({
              left: '15lpx',
              right: '15lpx',
              top: '7lpx',
              bottom: '7lpx'
            })
            .backgroundColor("#EFEFEF")
            .borderRadius(10)
            .margin('11lpx')
            .onAreaChange((previousArea: Area, currentArea: Area) => {
              console.info(`child currentArea item ${item}`);
              console.info(`child currentArea ${JSON.stringify(currentArea)}`);
              this.processPositions(item, new PosItem(currentArea.position.x as number, currentArea.position.y as number));
            })
        })
      }
      .width('100%')
      .padding({
        left: '26lpx',
        top: '11lpx',
        bottom: '11lpx',
        right: '26lpx'
      })
      .backgroundColor("#F8F8F8")

      ForEach(this.result, (item: Object, index: number) => {
        Text(`第${index}组:${JSON.stringify(item)}`).backgroundColor(Color.Pink)
      })

    }.width('100%')
  }
}

更多关于HarmonyOS 鸿蒙Next 使用Flex布局和onAreaChange事件计算并记录多行文本位置的实现方案的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next 使用Flex布局和onAreaChange事件计算并记录多行文本位置的实现方案的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用Flex布局和onAreaChange事件来计算并记录多行文本位置的实现方案,可以通过以下步骤进行:

  1. Flex布局设置:

    • 在XML布局文件中,为包含文本的组件设置Flex布局属性。确保使用ohos:flex_directionohos:justify_contentohos:align_items等属性来调整布局方向和对齐方式。
    • 设置文本组件的ohos:max_lines为一个大数值或者不设限,以允许文本换行。
  2. 文本组件事件监听:

    • 在Java(这里指HarmonyOS的Java扩展框架,非传统Java)代码中,为文本组件添加onAreaChange事件监听器。
    • 在事件监听器中,通过Component#getMeasuredHeight()Component#getMeasuredWidth()获取文本组件的实际测量高度和宽度。
  3. 计算文本位置:

    • 利用文本的布局参数(如行高、字体大小等)和测量尺寸,逐行计算文本在组件内的位置。
    • 可以使用TextLayout类(如果HarmonyOS提供类似功能)来获取更详细的文本布局信息。
  4. 记录位置:

    • 将计算出的文本位置信息存储在适当的数据结构中,如数组或列表中。

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

回到顶部