鸿蒙项目开发——Window和Display获取屏幕信息

【高心星出品】

Window和Display获取屏幕信息

概念

在鸿蒙中有window和Display两个模块管理屏幕的相关信息,包括屏幕宽高、屏幕分辨率、屏幕刷新率、通知栏信息,导航栏信息等。

但是两者又有所不同:

维度 Window Display
职责范围 管理应用程序窗口(大小、位置、状态) 管理物理显示设备(屏幕属性、方向)
数据来源 窗口布局完成后的实际尺寸 显示设备的物理参数(如分辨率)
变化监听 windowSizeChange/windowStatusChange change/foldDisplayModeChange
典型应用场景 窗口模式切换、分屏适配 屏幕旋转、折叠屏状态感知

下面我们用案例来展示他们的使用。

案例

案例一、获取屏幕基本信息

里面包含获取屏幕宽高信息、屏幕分辨率、屏幕刷新率

typescript 复制代码
import { display } from '@kit.ArkUI';

@Entry
@Component
struct Displaypage {
  @State msg: string = ''

  build() {
    Column({ space: 20 }) {
      Button('获取信息')
        .width('60%')
        .onClick(async () => {
          // 获取当前屏幕
          let disp = display.getDefaultDisplaySync()
          // 获取屏幕宽度和高度 单位px
          let width = disp.width
          let height = disp.height
          // 获取屏幕角度
          let rotation = disp.rotation == 0 ? '正向竖直' :
            (disp.rotation == 1 ? '水平90' : (disp.rotation == 2 ? '反向竖直' : '水平-90'))
          // 获取屏幕形状
          let pinshape = disp.screenShape == display.ScreenShape.RECTANGLE ? '矩形屏幕' : '圆形屏幕'
          // 获取屏幕刷新率
          let rate = disp.refreshRate
          this.msg =
            `display获取信息:\n屏幕宽度:${width}, 屏幕高度:${height}\n屏幕角度:${rotation}\n屏幕形状:${pinshape}\n屏幕刷新率:${rate}`
        })
      Text(this.msg).fontSize(20)

    }
    .height('100%')
    .width('100%')
  }
}
案例二、获取屏幕可布局区域信息

下面案例获取屏幕可布局区域的宽度和高度。

EntyAbility中通过windowstage获取窗口信息

typescript 复制代码
import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';

const DOMAIN = 0x0000;

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy(): void {
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
    //  获取当前主窗口
    let wind = windowStage.getMainWindowSync()
    // 获取通知栏区域
    let toparea = wind.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM)
    //  获取底部导航区域
    let bottomarea = wind.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR)
    //可布局宽度
    let uiwidth = wind.getWindowProperties().windowRect.width
    // 可布局高度,总高度减去通知栏高度和导航栏高度
    let uiheight = wind.getWindowProperties().windowRect.height - toparea.topRect.height - bottomarea.bottomRect.height
    // 将可布局的信息保存在appstorage中。
    AppStorage.setOrCreate('uiwidth',uiwidth)
    AppStorage.setOrCreate('uiheight',uiheight)
    windowStage.loadContent('pages/Displaypage1', (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.');
    });
  }

  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

页面中获取信息

typescript 复制代码
import { display } from '@kit.ArkUI';

@Entry
@Component
struct Displaypage1 {
  // 获取ability传过来的可布局宽度和高度
  @State uiwidth:number=AppStorage.get('uiwidth')!
  @State uiheight:number=AppStorage.get('uiheight')!
  build() {
    Column({ space: 20 }) {

      Text(`可布局宽度(px):${this.uiwidth}\n可布局高度(px):${this.uiheight}`).fontSize(20)

    }
    .height('100%')
    .width('100%')
  }
}
相关推荐
anyup12 小时前
🔥2026最推荐的跨平台方案:H5/小程序/App/鸿蒙,一套代码搞定
前端·uni-app·harmonyos
Ranger092917 小时前
鸿蒙开发新范式:Gpui
rust·harmonyos
Huang兄17 小时前
鸿蒙-深色模式适配
harmonyos·arkts·arkui
SummerKaze3 天前
为鸿蒙开发者写一个 nvm:hmvm 的设计与实现
harmonyos
在人间耕耘4 天前
HarmonyOS Vision Kit 视觉AI实战:把官方 Demo 改造成一套能长期复用的组件库
人工智能·深度学习·harmonyos
王码码20354 天前
Flutter for OpenHarmony:socket_io_client 实时通信的事实标准(Node.js 后端的最佳拍档) 深度解析与鸿蒙适配指南
android·flutter·ui·华为·node.js·harmonyos
HarmonyOS_SDK4 天前
【FAQ】HarmonyOS SDK 闭源开放能力 — Ads Kit
harmonyos
Swift社区4 天前
如何利用 ArkUI 框架优化鸿蒙应用的渲染性能
华为·harmonyos
特立独行的猫a4 天前
uni-app x跨平台开发实战:开发鸿蒙HarmonyOS影视票房榜组件完整实现过程
华为·uni-app·harmonyos·轮播图·uniapp-x
盐焗西兰花5 天前
鸿蒙学习实战之路-STG系列(5/11)-守护策略管理-添加与修改策略
服务器·学习·harmonyos