HarmonyOS鸿蒙Next中想要实现一个全局切换页面触发事件,事件内遍历当前切换到的页面所有文本,通过文本计算位置和宽高,能实现么?

HarmonyOS鸿蒙Next中想要实现一个全局切换页面触发事件,事件内遍历当前切换到的页面所有文本,通过文本计算位置和宽高,能实现么? 需要实现一个 切换页面 监听事件
每次切换页面就便利当前页面上的文本
并根据文本找到对应UI并计算出 此UI位于页面的坐标和宽高 可以实现么?
或者鸿蒙有什么试别文字位置的方法么?

IOS和安卓我用的都是通过文字计算,现在该做鸿蒙了,找了很多资料没有办法实现,请教一下各位老师
鸿蒙应该怎么实现,或者鸿蒙有别的更好的方式 获取 敏感信息的坐标和宽高么?
想实现一个 页面敏感信息识别

6 回复

实现思路: 楼主可以通过 uiObserver.on(‘routerPageUpdate’) 接口监听页面状态变化,触发敏感信息扫描逻辑;利用 onAreaChange 回调监听组件区域变化,获取文本组件的全局坐标和宽高;结合文本内容与其位置信息,通过自定义算法实现敏感信息标记或拦截。

实现步骤

1/ 监听页面切换事件

// 全局注册页面状态监听

import { uiObserver } from '@kit.ArkUI';

uiObserver.on('routerPageUpdate', (pageInfo) => {

  if (pageInfo.status === 'Shown') {

    // 触发敏感信息扫描

    scanSensitiveInfo();

  }

});

2/ 通过自定义高阶组件包装 Text,动态添加区域监听:

@Component

struct SensitiveText {

  @State private content: string;

  @State private pos: { x: number, y: number, width: number } = { x: 0, y: 0, width: 0 };

  build() {

    Text(this.content)

      .onAreaChange((oldVal, newVal) => {

        this.pos = {

          x: newVal.globalPosition.x,

          y: newVal.globalPosition.y,

          width: newVal.width

        };

        // 存储到全局管理类

        SensitiveManager.recordPosition(this.content, this.pos);

      })

  }

}

3/ 敏感信息处理逻辑

class SensitiveManager {

  static scanSensitiveInfo() {

    const textPositions = this.getRecordedPositions();

    textPositions.forEach((item) => {

      if (isSensitive(item.content)) {

        highlightArea(item.pos); // 高亮敏感区域

      }

    });

  }

}

更多关于HarmonyOS鸿蒙Next中想要实现一个全局切换页面触发事件,事件内遍历当前切换到的页面所有文本,通过文本计算位置和宽高,能实现么?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


楼主是不是想做一个脚本,类是于android 通过 adb中的 uiautomator 获取app中的布局信息。

如果你使用的是 Navigation 组件导航,可以使用路由拦截

NavPathStack提供了setInterception方法,用于设置Navigation页面跳转拦截回调。该方法需要传入一个NavigationInterception对象,该对象包含三个回调函数:

this.pageStack.setInterception({
  willShow: (from: NavDestinationContext | "navBar", to: NavDestinationContext | "navBar",
    operation: NavigationOperation, animated: boolean) => {
    if (typeof to === "string") {
      console.log("target page is navigation home page.");
      return;
    }
    // 将跳转到PageTwo的路由重定向到PageOne
    let target: NavDestinationContext = to as NavDestinationContext;
    if (target.pathInfo.name === 'PageTwo') {
      target.pathStack.pop();
      target.pathStack.pushPathByName('PageOne', null);
    }
  }
})

不好意思刚才我描述的不全面,后面补充了一下,我希望实现一个页面敏感信息识别,iOS和安卓我都是用的通过文字找到对应UI,计算UI位于当前页面的定位和宽高实现。鸿蒙有办法可以实现么?

在HarmonyOS Next中,可以通过页面生命周期回调(如aboutToAppear)监听页面切换。使用@ohos.ui组件获取根组件,递归遍历子组件,识别Text组件并提取文本内容。通过组件属性(如position和size)可计算位置与宽高。需注意性能优化,避免频繁遍历影响体验。

在HarmonyOS Next中,可以通过全局页面路由监听结合组件布局信息获取来实现文本位置和宽高的计算。具体步骤如下:

  1. 使用router模块监听页面切换:

    import router from '[@ohos](/user/ohos).router'
    router.addObserver((event) => {
      if (event.type === RouterEvent.PUSH || event.type === RouterEvent.REPLACE) {
        // 页面切换后执行文本遍历
        setTimeout(() => {
          this.traversePageText()
        }, 500) // 适当延迟确保页面渲染完成
      }
    })
    
  2. 通过自定义组件ID或类型遍历文本元素:

    private traversePageText() {
      const rootNode = getRootNode() as FrameNode
      this.findTextNodes(rootNode)
    }
    
    private findTextNodes(node: UINode) {
      if (node.type === NodeType.TEXT) {
        this.calculateTextLayout(node)
      }
      node.children?.forEach(child => {
        this.findTextNodes(child)
      })
    }
    
  3. 使用measure方法获取组件布局信息:

    private calculateTextLayout(textNode: TextNode) {
      textNode.measure((width, height) => {
        const globalRect = textNode.getBoundingClientRect()
        // 获得文本的坐标(x, y)和宽高(width, height)
      })
    }
    

注意事项:

  • 需要确保组件已设置有效ID或可通过组件树准确遍历
  • 页面渲染完成后再执行测量,避免获取到不准确的布局数据
  • 性能考虑建议对遍历操作进行节流处理

鸿蒙的布局系统基于声明式UI,通过组件树遍历和测量API可以准确获取文本元素的位置信息。

回到顶部