《HarmonyOS Next 屏幕适配:获取设备屏幕宽高数据》

《HarmonyOS Next 屏幕适配:获取设备屏幕宽高数据》

前言

在鸿蒙应用开发中,屏幕适配是一个非常重要的环节。不同设备具有不同的屏幕尺寸和分辨率,为了确保应用在各种设备上都能获得良好的显示效果,我们需要获取设备的屏幕信息并进行适配。本文将详细介绍如何在鸿蒙ArkTS中获取设备的屏幕宽高数据,并实现一个可复用的屏幕适配工具类。

文章目录

前言一、实现原理1.1 核心API介绍1.2 数据存储方案

二、代码实现2.1 屏幕适配工具类2.2 在EntryAbility中初始化

三、使用示例3.1 在页面中获取屏幕信息3.2 响应式布局示例

四、最佳实践4.1 单位换算4.2 错误处理4.3 性能优化

五、常见问题5.1 屏幕旋转处理5.2 多屏适配

六、总结

图1、图2:不同尺寸的显示器对比,展示了彼此的屏幕尺寸差异

一、实现原理

1.1 核心API介绍

鸿蒙系统提供了两个重要的API来获取屏幕信息:

@ohos.window:提供窗口管理相关功能@ohos.display:提供显示设备信息相关功能

1.2 数据存储方案

为了在应用的不同组件中都能方便地访问屏幕信息,我们采用以下存储方案:

使用静态变量存储当前屏幕信息通过AppStorage实现应用内数据共享使用PersistentStorage实现数据持久化

二、代码实现

2.1 屏幕适配工具类

import window from '@ohos.window';

import display from '@ohos.display';

export class ScreenAdapter {

// 当前屏幕宽度(单位:vp)

private static screenWidth: number = 0;

// 当前屏幕高度(单位:vp)

private static screenHeight: number = 0;

/**

* 初始化屏幕适配

* @param windowStage 窗口对象

*/

static init(windowStage: window.WindowStage) {

try {

const win = windowStage.getMainWindowSync();

const displayInfo = display.getDefaultDisplaySync();

// 获取屏幕信息,转化单位为vp

ScreenAdapter.screenWidth = px2vp(displayInfo.width);

ScreenAdapter.screenHeight = px2vp(displayInfo.height);

// 存储屏幕信息到AppStorage

AppStorage.setOrCreate('screenWidth', ScreenAdapter.screenWidth);

AppStorage.setOrCreate('screenHeight', ScreenAdapter.screenHeight);

PersistentStorage.persistProp('screenWidth', ScreenAdapter.screenWidth);

PersistentStorage.persistProp('screenHeight', ScreenAdapter.screenHeight);

} catch (error) {

console.error('屏幕适配初始化失败:', error);

}

}

/**

* 获取屏幕宽度

* @returns 屏幕宽度

*/

static getScreenWidth(): number {

return ScreenAdapter.screenWidth;

}

/**

* 获取屏幕高度

* @returns 屏幕高度

*/

static getScreenHeight(): number {

return ScreenAdapter.screenHeight;

}

}

提示:displayInfo 对象包含丰富的屏幕信息,可以通过以下代码查看完整信息:

console.info(JSON.stringify(displayInfo))

输出示例:

{

"id": 0,

"name": "UNKNOWN",

"alive": true,

"state": 0,

"refreshRate": 60,

"rotation": 0,

"width": 1260,

"height": 2720,

"densityDPI": 520,

"orientation": 0,

"densityPixels": 3.25,

"scaledDensity": 3.25,

"xDPI": 444.5,

"yDPI": 442.8710021972656,

"colorSpaces": [],

"hdrFormats": [],

"availableWidth": 1260,

"availableHeight": 2720

}

2.2 在EntryAbility中初始化

import window from '@ohos.window';

import { ScreenAdapter } from './ScreenAdapter';

export default class EntryAbility extends UIAbility {

onWindowStageCreate(windowStage: window.WindowStage): void {

// 初始化屏幕适配

ScreenAdapter.init(windowStage);

// 加载主页面

windowStage.loadContent('pages/Index', (err) => {

if (err.code) {

console.error('Failed to load the content. Cause: ' + JSON.stringify(err));

return;

}

console.info('Succeeded in loading the content.');

});

}

}

三、使用示例

3.1 在页面中获取屏幕信息

import { ScreenAdapter } from '../utils/ScreenAdapter';

@Entry

@Component

struct Index {

@StorageProp('screenWidth') screenWidth: number = 0;

@StorageProp('screenHeight') screenHeight: number = 0;

build() {

Column() {

Text(`屏幕宽度:${this.screenWidth}vp`)

.fontSize(20)

.margin(10)

Text(`屏幕高度:${this.screenHeight}vp`)

.fontSize(20)

.margin(10)

Text(`屏幕宽度:${vp2px(this.screenWidth)}px`)

.fontSize(20)

.margin(10)

Text(`屏幕高度:${vp2px(this.screenHeight)}px`)

.fontSize(20)

.margin(10)

}

.width('100%')

.height('100%')

.justifyContent(FlexAlign.Center)

}

}

图3:屏幕信息显示效果,展示了在应用中显示屏幕宽高信息的效果

3.2 响应式布局示例

@Entry

@Component

struct ResponsiveLayout {

build() {

Column() {

// 根据屏幕宽度自适应布局

Row() {

Text('左侧内容')

.width(this.screenWidth * 0.3)

Text('右侧内容')

.width(this.screenWidth * 0.7)

}

.width('100%')

.height(this.screenHeight * 0.5)

}

}

}

四、最佳实践

4.1 单位换算

在鸿蒙开发中,我们通常使用以下单位:

vp(Viewport Pixel):虚拟像素,会根据屏幕密度自动适配px(Pixel):物理像素,与设备实际像素一一对应

建议在开发中优先使用vp单位,这样可以自动适配不同密度的屏幕。

4.2 错误处理

在获取屏幕信息时,需要注意以下几点:

使用try-catch捕获可能的异常提供默认值,避免空值导致应用崩溃在关键操作处添加日志,方便调试

4.3 性能优化

避免频繁获取屏幕信息,建议在初始化时获取并缓存使用AppStorage实现数据共享,减少重复计算合理使用PersistentStorage,避免过度持久化

五、常见问题

5.1 屏幕旋转处理

当设备发生旋转时,需要重新获取屏幕信息:

onWindowStageChange(windowStage: window.WindowStage) {

// 重新初始化屏幕适配

ScreenAdapter.init(windowStage);

}

5.2 多屏适配

对于支持多屏显示的场景,需要获取特定屏幕的信息:

const displays = display.getAllDisplays();

displays.forEach((displayInfo) => {

// 处理每个屏幕的信息

});

六、总结

本文详细介绍了在鸿蒙ArkTS中获取设备屏幕宽高数据的方法,并提供了一个完整的屏幕适配解决方案。通过使用ScreenAdapter工具类,我们可以:

统一管理屏幕信息实现响应式布局适配不同设备优化应用性能

希望本文对您的鸿蒙应用开发有所帮助。如果您有任何问题或建议,欢迎在评论区留言讨论。

✧ 相关推荐 ✧

十二生肖单数有哪些数字
365bet体育足球比分

十二生肖单数有哪些数字

📅 07-04 👁️ 4590
历届世界杯时间一览表?世界杯往年时间
365bet体育足球比分

历届世界杯时间一览表?世界杯往年时间

📅 07-06 👁️ 5666
世界杯只剩理论可能!提前备战下一届,中国足球需做好这三件事