HarmonyOS 鸿蒙Next中在Ability文件中如何使用px2vp?
HarmonyOS 鸿蒙Next中在Ability文件中如何使用px2vp? The signature ‘(value: number): number’ of ‘px2vp’ is deprecated. <ArkTSCheck>
更多关于HarmonyOS 鸿蒙Next中在Ability文件中如何使用px2vp?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
背景知识:
楼主,在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
-
要从uicontext中拿px2vp
-
uicontext只有两种获取,一个是组件中,一个是window实例中
-
看你的需求,代码应该这样
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()
参考文档:警告弹窗 (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实例,确保转换基于当前屏幕密度。