当前位置: 首页 > news >正文

用 DisplayUtil 获取 HarmonyOS 屏幕方向:Orientation 枚举与 DisplayState 枚举详解

文章目录一、前言二、工具函数方法一览三、方法逐一详解3.1 getWidth() 与 getHeight()3.2 getOrientation() — 获取屏幕方向3.3 getDisplayState() — 获取显示状态四、完整演示代码4.1 数据加载4.2 UI 渲染尺寸与方向页五、实际应用场景场景 1横竖屏布局切换场景 2计算可用空间结合状态栏高度场景 3判断屏幕是否亮屏六、小结一、前言近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓在开发 HarmonyOS 应用时经常需要知道屏幕宽高是多少用于计算布局尺寸当前屏幕是竖屏还是横屏用于旋转适配屏幕当前的显示状态是什么是否亮屏、是否 VR 模式DisplayUtil提供了getWidth()、getHeight()、getOrientation()、getDisplayState()四个方法来解答这些问题。本文结合DisplayUtilDemoPage.ets中的完整演示代码进行详细讲解。二、工具函数方法一览// 获取屏幕宽度pxstaticgetWidth():number// 获取屏幕高度pxstaticgetHeight():number// 获取当前显示方向0竖屏/1横屏/2反向竖屏/3反向横屏staticgetOrientation():display.Orientation// 获取显示设备当前状态关闭/开启/低电耗/睡眠/VR等staticgetDisplayState():display.DisplayState三、方法逐一详解3.1getWidth()与getHeight()源码staticgetWidth():number{returnDisplayUtil.getDefaultDisplaySync().width;}staticgetHeight():number{returnDisplayUtil.getDefaultDisplaySync().height;}说明两个方法本质上都是先获取默认Display对象再取width或height字段。返回值单位为物理像素px。注意ArkUI 布局中用的是vp虚拟像素vp px / densityPixels。如果要用于布局计算需要做单位换算。Demo 使用loadScreenSize(){this.screenWidth${DisplayUtil.getWidth()}px;this.screenHeight${DisplayUtil.getHeight()}px;// ...}3.2getOrientation()— 获取屏幕方向源码staticgetOrientation():display.Orientation{returnDisplayUtil.getDefaultDisplaySync().orientation;}display.Orientation枚举值说明枚举值数字含义PORTRAIT0竖屏正常持握手机方向LANDSCAPE1横屏向左旋转 90°PORTRAIT_INVERTED2反向竖屏倒置手机LANDSCAPE_INVERTED3反向横屏向右旋转 90°Demo 中的枚举转换getOrientationLabel(orientation:display.Orientation):string{switch(orientation){casedisplay.Orientation.PORTRAIT:return竖屏 (PORTRAIT0);casedisplay.Orientation.LANDSCAPE:return横屏 (LANDSCAPE1);casedisplay.Orientation.PORTRAIT_INVERTED:return反向竖屏 (PORTRAIT_INVERTED2);casedisplay.Orientation.LANDSCAPE_INVERTED:return反向横屏 (LANDSCAPE_INVERTED3);default:return未知 (${orientation});}}使用loadOrientation(){constorientationDisplayUtil.getOrientation();this.orientationValueorientation.toString();this.orientationLabelthis.getOrientationLabel(orientation);// ...}3.3getDisplayState()— 获取显示状态源码staticgetDisplayState():display.DisplayState{returnDisplayUtil.getDefaultDisplaySync().state;}display.DisplayState枚举值说明枚举值数字含义STATE_UNKNOWN0状态未知STATE_OFF1显示设备已关闭熄屏STATE_ON2显示设备已开启亮屏STATE_DOZE3低电耗模式息屏显示STATE_DOZE_SUSPEND4睡眠模式CPU 挂起STATE_VR5VR 模式STATE_ON_SUSPEND6亮屏但 CPU 挂起Demo 中的枚举转换getDisplayStateLabel(state:display.DisplayState):string{switch(state){casedisplay.DisplayState.STATE_UNKNOWN:return未知 (STATE_UNKNOWN0);casedisplay.DisplayState.STATE_OFF:return关闭 (STATE_OFF1);casedisplay.DisplayState.STATE_ON:return开启 (STATE_ON2);casedisplay.DisplayState.STATE_DOZE:return低电耗 (STATE_DOZE3);casedisplay.DisplayState.STATE_DOZE_SUSPEND:return睡眠 (STATE_DOZE_SUSPEND4);casedisplay.DisplayState.STATE_VR:returnVR模式 (STATE_VR5);casedisplay.DisplayState.STATE_ON_SUSPEND:return亮屏挂起 (STATE_ON_SUSPEND6);default:return未知 (${state});}}四、完整演示代码4.1 数据加载loadScreenSize(){this.screenWidth${DisplayUtil.getWidth()}px;this.screenHeight${DisplayUtil.getHeight()}px;// 计算屏幕尺寸英寸try{constdDisplayUtil.getDefaultDisplaySync();constwInchd.width/d.densityDPI;consthInchd.height/d.densityDPI;constdiagMath.sqrt(wInch*wInchhInch*hInch);this.screenSize${diag.toFixed(2)}英寸 (${wInch.toFixed(2)}x${hInch.toFixed(2)});}catch(e){this.screenSize计算失败;}this.addLog(Size,屏幕尺寸:${this.screenWidth}x${this.screenHeight},info);}loadOrientation(){constorientationDisplayUtil.getOrientation();this.orientationValueorientation.toString();this.orientationLabelthis.getOrientationLabel(orientation);conststateDisplayUtil.getDisplayState();this.displayStateValuestate.toString();this.displayStateLabelthis.getDisplayStateLabel(state);this.addLog(Orientation,方向:${this.orientationLabel}, 状态:${this.displayStateLabel},info);}4.2 UI 渲染尺寸与方向页// ══ 尺寸与方向 ══════════════════════════════════════if(this.activeTab1){// 屏幕尺寸Column(){Text(屏幕尺寸).fontSize(13).fontColor(#666).fontWeight(FontWeight.Medium).alignSelf(ItemAlign.Start).margin({bottom:10})Row(){Column(){Text(this.screenWidth.split( )[0]).fontSize(28).fontWeight(FontWeight.Bold).fontColor(#4080FF)Text(宽度 px).fontSize(11).fontColor(#888)}.layoutWeight(1).alignItems(HorizontalAlign.Center)Text(×).fontSize(20).fontColor(#CCC)Column(){Text(this.screenHeight.split( )[0]).fontSize(28).fontWeight(FontWeight.Bold).fontColor(#00C853)Text(高度 px).fontSize(11).fontColor(#888)}.layoutWeight(1).alignItems(HorizontalAlign.Center)Text(≈).fontSize(20).fontColor(#CCC)Column(){Text(this.screenSize.split( )[0]).fontSize(22).fontWeight(FontWeight.Bold).fontColor(#D63384)Text(对角线英寸).fontSize(11).fontColor(#888)}.layoutWeight(1).alignItems(HorizontalAlign.Center)}.width(100%).margin({bottom:6})Text(this.screenSize).fontSize(11).fontColor(#888).width(100%).textAlign(TextAlign.Center)Button(刷新尺寸信息).fontSize(12).height(34).margin({top:10}).backgroundColor(#4080FF).fontColor(#FFF).onClick((){this.loadScreenSize();})}.width(100%).padding(14).backgroundColor(#FFFFFF).borderRadius(12)// 屏幕方向Column(){Text(屏幕方向 getOrientation()).fontSize(13).fontColor(#666).fontWeight(FontWeight.Medium).alignSelf(ItemAlign.Start).margin({bottom:8})Row(){Text(当前方向:).fontSize(12).fontColor(#888)Text(this.orientationLabel).fontSize(12).fontWeight(FontWeight.Bold).fontColor(#4080FF).margin({left:6})Text((数值:${this.orientationValue})).fontSize(11).fontColor(#AAA).margin({left:4})}.width(100%).margin({bottom:8})Row(){Text(显示状态:).fontSize(12).fontColor(#888)Text(this.displayStateLabel).fontSize(12).fontWeight(FontWeight.Bold).fontColor(this.displayStateLabel.includes(开启)?#00C853:#FF9800).margin({left:6})Text((数值:${this.displayStateValue})).fontSize(11).fontColor(#AAA).margin({left:4})}.width(100%).margin({bottom:10})Button(刷新方向信息).fontSize(12).height(34).backgroundColor(#4080FF).fontColor(#FFF).onClick((){this.loadOrientation();})}.width(100%).padding(14).backgroundColor(#FFFFFF).borderRadius(12)// Orientation 枚举说明this.buildSectionCard(Orientation 枚举值说明,[{label:PORTRAIT 0,value:竖屏},{label:LANDSCAPE 1,value:横屏},{label:PORTRAIT_INVERTED 2,value:反向竖屏},{label:LANDSCAPE_INVERTED 3,value:反向横屏},]asSectionRow[])// DisplayState 说明this.buildSectionCard(DisplayState 枚举值说明,[{label:STATE_UNKNOWN 0,value:未知},{label:STATE_OFF 1,value:关闭},{label:STATE_ON 2,value:开启},{label:STATE_DOZE 3,value:低电耗},{label:STATE_DOZE_SUSPEND 4,value:睡眠},{label:STATE_VR 5,value:VR模式},{label:STATE_ON_SUSPEND 6,value:亮屏挂起},]asSectionRow[])}五、实际应用场景场景 1横竖屏布局切换constorientationDisplayUtil.getOrientation();if(orientationdisplay.Orientation.LANDSCAPE||orientationdisplay.Orientation.LANDSCAPE_INVERTED){// 横屏布局两列显示this.columnCount2;}else{// 竖屏布局单列显示this.columnCount1;}场景 2计算可用空间结合状态栏高度constscreenHeightDisplayUtil.getHeight();conststatusBarHeightAppUtil.getStatusBarHeight();// 获取状态栏高度constavailableHeightscreenHeight-statusBarHeight;场景 3判断屏幕是否亮屏conststateDisplayUtil.getDisplayState();if(statedisplay.DisplayState.STATE_ON){// 屏幕亮着可以更新 UIthis.refreshUI();}六、小结方法返回类型说明getWidth()number屏幕宽度物理像素 pxgetHeight()number屏幕高度物理像素 pxgetOrientation()display.Orientation0竖屏/1横屏/2反向竖/3反向横getDisplayState()display.DisplayState关闭/开启/低电耗/睡眠/VR等这四个方法是开发横竖屏适配和屏幕状态感知的基础。配合后面介绍的屏幕旋转监听addOnScreenOrientationChange可以实现实时响应旋转事件的自适应界面。
http://www.rkmt.cn/news/1408053.html

相关文章:

  • 深度解析TrueSkill技能评估算法:Python实战指南与动态评分系统应用
  • YgoMaster:三步搭建你的游戏王离线决斗王国
  • FanControl深度指南:3步实现Windows系统风扇智能控制
  • Java进阶之路:从Final到接口的深度解析
  • 全地形车市场洞察:2026-2032期间年复合增长率(CAGR)为4.5%
  • 基于DSSS的近超声波通信:原理、实现与手机音频硬件应用
  • WeChatMsg技术解析:微信聊天记录的数据主权回归与智能分析实践
  • 终极指南:如何在Mac上免费获取689款开源应用程序
  • 海康威视摄像头SDK接入Unity实战:不只是云台,还有登录、保活与资源释放的完整生命周期管理
  • NVM文件系统设计:原理、挑战与性能优化实践
  • Windows 10上的Android生态系统:让移动应用在桌面环境中自由运行
  • ArcGIS Pro二次开发:地图图层管理的10个高频C#代码片段(附避坑指南)
  • RuoYi-flowable工作流:从零到一的Spring Boot+Vue低代码实践
  • 别再重启电脑了!Windows安全中心这个设置,轻松解决U盘弹出被MsMpEng.exe占用的问题
  • League-Toolkit终极指南:5个智能功能提升你的英雄联盟游戏体验
  • 【2024财务AI合规红线】:ChatGPT预测模型能否进财报附注?监管备案清单+模型可解释性验证工具包
  • XLUUV水动力CFD仿真:网格与迭代收敛性验证实践
  • ChatGPT游戏攻略生成失效真相(92%开发者忽略的3个上下文断层)
  • NocoDB:如何在5分钟内将传统数据库转换为可视化协作平台
  • Msys2疑难杂症排查与优化实战指南
  • 【法律人AI提效革命】:ChatGPT起草合同/诉状/律师函的7大黄金准则与3类致命误用风险
  • 智谱GLM-5技术深度解析:7440亿参数如何实现高效推理与卓越能力?
  • SAP BASIS实战:从零到一构建STMS传输域与请求流转
  • 为Hermes Agent配置自定义模型供应商,接入Taotoken享受官方价折扣
  • SkyClaw-v1.0 发布:国产百万上下文 Agent 模型,能不能替代 Claude Code?
  • 小蜜蜂扩音不再啸叫,A59F 模组让老师讲课更轻松
  • OFDM-CVQKD:面向太赫兹无线量子通信的协议原理与性能分析
  • 学校要求AI率15%以下怎么办?2026年5月4款降AI软件深度推荐 - 我要发一区
  • 如何5分钟一键解锁Honey Select 2完整汉化与去码功能:终极增强指南
  • 告别繁琐操作!这款电子课本下载神器让教师备课效率翻倍 [特殊字符]