HarmonyOS 鸿蒙Next中在Ability文件中如何使用px2vp?

HarmonyOS 鸿蒙Next中在Ability文件中如何使用px2vp? The signature ‘(value: number): number’ of ‘px2vp’ is deprecated. <ArkTSCheck>

cke_364.png


更多关于HarmonyOS 鸿蒙Next中在Ability文件中如何使用px2vp?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

12 回复

背景知识:

楼主,在ability中可以使用 windowStage.getMainWindowSync().getUIContext() 来获取 px2vp 方法。

注意:一定要在 windowStage.loadContent 的回调里面进行获取,不然会出现异常:Error message:This window state is abnormal.

问题处理:

代码示例:

windowStage.loadContent("pages/px2vpPage", (err, data) => {
    if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s',
            JSON.stringify(err) ?? '');
        return;
    }
    hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s',
        JSON.stringify(data) ?? '');

    //只能放入这里进行初始化,当如oncreate没有效果
    PersistentStorage.persistProp("saveTime", 0);


    let mainWindow = windowStage.getMainWindowSync()
    let avoidArea = mainWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR)
    let height = avoidArea.topRect.height
    let vpHeight = windowStage.getMainWindowSync().getUIContext().px2vp(height)
    console.log("px2vp height="+height+" vpHeight="+vpHeight)
    AppStorage.setOrCreate("topRectHeight",
        windowStage.getMainWindowSync().getUIContext().px2vp(avoidArea.topRect.height))

});

更多关于HarmonyOS 鸿蒙Next中在Ability文件中如何使用px2vp?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我测试了,在windowStage.loadContent回调外也能用。

不会吧!昨天我试了两次,都报错了呢。

在windowSizeChange回调里可以用。

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

  1. 要从uicontext中拿px2vp

  2. uicontext只有两种获取,一个是组件中,一个是window实例中

  3. 看你的需求,代码应该这样

let window = windowStage.getMainWindowSync() window.getUIContext().px2vp(2)

onWindowStageCreate(windowStage: window.WindowStage): void {
  // Main window is created, set main page for this ability
  hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

  let window = windowStage.getMainWindowSync()
  window.getUIContext().px2vp(2)

  windowStage.loadContent('pages/Index', (err) => {
    if (err.code) {
      hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
      return;
    }
    hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');
  });
}
let window = windowStage.getMainWindowSync();
window.getUIContext().px2vp(2);

改成这个写法怎么启动App直接白屏了?

1.这个接口这样使用被弃用的原因是因为上下文不明确导致的,后续版本增加了新的写法,必须要通过上下文来获取:下面这样使用就不会警告了

this.getUIContext().px2vp()

cke_1727.png

参考文档:警告弹窗 (AlertDialog)-弹窗-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者

解决方案

1/导入显示模块:

import display from '@kit.ArkUI.Core'; // 注意已升级为Kits形式

2/单位转换示例:

// 获取屏幕参数

const screen = display.getDefaultDisplaySync();

// 将屏幕宽度转换为vp单位

const screenWidthVp = vp2px(screen.width); // 替代旧版px2vp

在HarmonyOS Next的Ability文件中,通过display.getDefault().then(display => { display.vp2px(value) })进行单位转换。使用@ohos.display模块获取屏幕参数,调用vp2px方法将虚拟像素转换为物理像素。需在UI上下文中获取Display实例,确保转换基于当前屏幕密度。

在HarmonyOS Next中,px2vp方法已被标记为过时,建议使用更标准的单位转换方式。推荐通过display模块获取屏幕密度信息,然后手动计算vp值。例如:

import display from '@ohos.display';

// 获取默认屏幕信息
let displayInfo = display.getDefaultDisplaySync();
let density = displayInfo.density; // 屏幕密度

// 手动转换px到vp
function pxToVp(pxValue: number): number {
    return pxValue / density;
}

// 使用示例
let vpValue = pxToVp(100); // 将100px转换为vp

这种方式更符合HarmonyOS Next的设计规范,且避免使用废弃API。

回到顶部