import { display } from '@kit.ArkUI';
import { Callback } from '@kit.BasicServicesKit';
/**
* 屏幕相关工具类
* author: 鸿蒙布道师
* since: 2025/04/10
*/
export class DisplayUtil {
/**
* 获取当前默认的 display 对象。
* @returns 当前默认的 display 对象。
*/
private static getDefaultDisplaySync(): display.Display {
return display.getDefaultDisplaySync();
}
/**
* 获取设备的屏幕宽度,单位为 px。
* @returns 屏幕宽度。
*/
static getWidth(): number {
return DisplayUtil.getDefaultDisplaySync().width;
}
/**
* 获取设备的屏幕高度,单位为 px。
* @returns 屏幕高度。
*/
static getHeight(): number {
return DisplayUtil.getDefaultDisplaySync().height;
}
/**
* 获取设备当前显示的方向。
* Orientation:
* PORTRAIT (0): 竖屏方式显示。
* LANDSCAPE (1): 横屏方式显示。
* PORTRAIT_INVERTED (2): 反向竖屏方式显示。
* LANDSCAPE_INVERTED (3): 反向横屏方式显示。
* @returns 当前显示方向。
*/
static getOrientation(): display.Orientation {
return DisplayUtil.getDefaultDisplaySync().orientation;
}
/**
* 获取设备的状态。
* DisplayState:
* STATE_UNKNOWN (0): 显示设备状态未知。
* STATE_OFF (1): 显示设备关闭。
* STATE_ON (2): 显示设备开启。
* STATE_DOZE (3): 显示设备低电耗模式。
* STATE_DOZE_SUSPEND (4): 显示设备睡眠模式(CPU挂起)。
* STATE_VR (5): 显示设备VR模式。
* STATE_ON_SUSPEND (6): 显示设备开启状态(CPU挂起)。
* @returns 当前显示状态。
*/
static getDisplayState(): display.DisplayState {
return DisplayUtil.getDefaultDisplaySync().state;
}
/**
* 获取挖孔屏、刘海屏等不可用屏幕区域信息。
* 建议应用布局规避该区域。
* @returns 不可用屏幕区域信息。
*/
static async getCutoutRect(): Promise<display.Rect> {
const cutoutInfo = await DisplayUtil.getDefaultDisplaySync().getCutoutInfo();
return cutoutInfo.boundingRects[0];
}
/**
* 获取挖孔屏、刘海屏等不可用屏幕区域的高度,单位 px。
* @returns 不可用屏幕区域的高度。
*/
static async getCutoutHeight(): Promise<number> {
const rect = await DisplayUtil.getCutoutRect();
return rect ? rect.height : 0;
}
/**
* 检查设备是否可折叠。
* @returns 是否可折叠。
*/
static isFoldable(): boolean {
return display.isFoldable();
}
/**
* 获取可折叠设备的当前折叠状态。
* FoldStatus:
* FOLD_STATUS_UNKNOWN (0): 折叠状态未知。
* FOLD_STATUS_EXPANDED (1): 完全展开。
* FOLD_STATUS_FOLDED (2): 折叠。
* FOLD_STATUS_HALF_FOLDED (3): 半折叠。
* @returns 当前折叠状态。
*/
static getFoldStatus(): display.FoldStatus {
return display.getFoldStatus();
}
/**
* 获取可折叠设备的显示模式。
* FoldDisplayMode:
* FOLD_DISPLAY_MODE_UNKNOWN (0): 折叠显示模式未知。
* FOLD_DISPLAY_MODE_FULL (1): 全屏显示。
* FOLD_DISPLAY_MODE_MAIN (2): 主屏幕显示。
* FOLD_DISPLAY_MODE_SUB (3): 子屏幕显示。
* FOLD_DISPLAY_MODE_COORDINATION (4): 双屏协同显示。
* @returns 当前折叠显示模式。
*/
static getFoldDisplayMode(): display.FoldDisplayMode {
return display.getFoldDisplayMode();
}
/**
* 开启折叠设备折叠状态变化的监听。
* @param callback 回调函数。
*/
static onFoldStatusChange(callback: Callback<display.FoldStatus>): void {
display.on('foldStatusChange', callback);
}
/**
* 关闭折叠设备折叠状态变化的监听。
* @param callback 回调函数(可选)。
*/
static offFoldStatusChange(callback?: Callback<display.FoldStatus>): void {
display.off('foldStatusChange', callback);
}
}
代码如下:
import { display } from '@kit.ArkUI';
import { Callback } from '@kit.BasicServicesKit';
/**
* 屏幕相关工具类
* author: 鸿蒙布道师
* since: 2025/04/10
*/
export class DisplayUtil {
/**
* 获取当前默认的 display 对象。
* @returns 当前默认的 display 对象。
*/
private static getDefaultDisplaySync(): display.Display {
return display.getDefaultDisplaySync();
}
/**
* 获取设备的屏幕宽度,单位为 px。
* @returns 屏幕宽度。
*/
static getWidth(): number {
return DisplayUtil.getDefaultDisplaySync().width;
}
/**
* 获取设备的屏幕高度,单位为 px。
* @returns 屏幕高度。
*/
static getHeight(): number {
return DisplayUtil.getDefaultDisplaySync().height;
}
/**
* 获取设备当前显示的方向。
* Orientation:
* PORTRAIT (0): 竖屏方式显示。
* LANDSCAPE (1): 横屏方式显示。
* PORTRAIT_INVERTED (2): 反向竖屏方式显示。
* LANDSCAPE_INVERTED (3): 反向横屏方式显示。
* @returns 当前显示方向。
*/
static getOrientation(): display.Orientation {
return DisplayUtil.getDefaultDisplaySync().orientation;
}
/**
* 获取设备的状态。
* DisplayState:
* STATE_UNKNOWN (0): 显示设备状态未知。
* STATE_OFF (1): 显示设备关闭。
* STATE_ON (2): 显示设备开启。
* STATE_DOZE (3): 显示设备低电耗模式。
* STATE_DOZE_SUSPEND (4): 显示设备睡眠模式(CPU挂起)。
* STATE_VR (5): 显示设备VR模式。
* STATE_ON_SUSPEND (6): 显示设备开启状态(CPU挂起)。
* @returns 当前显示状态。
*/
static getDisplayState(): display.DisplayState {
return DisplayUtil.getDefaultDisplaySync().state;
}
/**
* 获取挖孔屏、刘海屏等不可用屏幕区域信息。
* 建议应用布局规避该区域。
* @returns 不可用屏幕区域信息。
*/
static async getCutoutRect(): Promise<display.Rect> {
const cutoutInfo = await DisplayUtil.getDefaultDisplaySync().getCutoutInfo();
return cutoutInfo.boundingRects[0];
}
/**
* 获取挖孔屏、刘海屏等不可用屏幕区域的高度,单位 px。
* @returns 不可用屏幕区域的高度。
*/
static async getCutoutHeight(): Promise<number> {
const rect = await DisplayUtil.getCutoutRect();
return rect ? rect.height : 0;
}
/**
* 检查设备是否可折叠。
* @returns 是否可折叠。
*/
static isFoldable(): boolean {
return display.isFoldable();
}
/**
* 获取可折叠设备的当前折叠状态。
* FoldStatus:
* FOLD_STATUS_UNKNOWN (0): 折叠状态未知。
* FOLD_STATUS_EXPANDED (1): 完全展开。
* FOLD_STATUS_FOLDED (2): 折叠。
* FOLD_STATUS_HALF_FOLDED (3): 半折叠。
* @returns 当前折叠状态。
*/
static getFoldStatus(): display.FoldStatus {
return display.getFoldStatus();
}
/**
* 获取可折叠设备的显示模式。
* FoldDisplayMode:
* FOLD_DISPLAY_MODE_UNKNOWN (0): 折叠显示模式未知。
* FOLD_DISPLAY_MODE_FULL (1): 全屏显示。
* FOLD_DISPLAY_MODE_MAIN (2): 主屏幕显示。
* FOLD_DISPLAY_MODE_SUB (3): 子屏幕显示。
* FOLD_DISPLAY_MODE_COORDINATION (4): 双屏协同显示。
* @returns 当前折叠显示模式。
*/
static getFoldDisplayMode(): display.FoldDisplayMode {
return display.getFoldDisplayMode();
}
/**
* 开启折叠设备折叠状态变化的监听。
* @param callback 回调函数。
*/
static onFoldStatusChange(callback: Callback<display.FoldStatus>): void {
display.on('foldStatusChange', callback);
}
/**
* 关闭折叠设备折叠状态变化的监听。
* @param callback 回调函数(可选)。
*/
static offFoldStatusChange(callback?: Callback<display.FoldStatus>): void {
display.off('foldStatusChange', callback);
}
}