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

HarmonyOS:UI布局屏幕适配不同机型

一、屏幕适配

vp具体计算公式为:vp= px/(DPI/160)

px就是屏幕真实物理像素值,densityPixels是屏幕密度,是和标准DPI的比例,常见取值有0.75,1.0,1.5,2.0,3.0等,在HarmonyOS中,标准DPI为160,以华为mate 40 pro为例,查询得到的densityPixels=3.5,densityDPI=560。densityDPI就是我们通常所说的系统屏幕密度,densityPixels就是屏幕密度和标准dpi(160)的比率。想要查看真机的dpi,可以调用屏幕属性中的display接口查询。

二、测试结果

结果图

在这里插入图片描述

TestDisplay.ets文件代码

import { display } from '@kit.ArkUI'

@Entry
@Component
struct TestDisplay {
  @State message: string = 'UI布局自适应不同机器';
  @State deviceDPI: string | null = ""
  @State cutoutInfo: string | null = ""

  /**
   * vp具体计算公式为:vp= px/(DPI/160)
   *
   * px就是屏幕真实物理像素值,densityPixels是屏幕密度,是和标准DPI的比例
   *
   * 查看设备的dpi
   */
  getDPI() {
    let displayClass: display.Display | null = null;
    try {
      displayClass = display.getDefaultDisplaySync();
      this.deviceDPI = displayClass.densityDPI.toString();
      console.log(`屏幕密度 dpi =  ${this.deviceDPI}`);
      this.pxTovp(100, displayClass.densityDPI);
    } catch (exception) {
      console.error('获取屏幕属性 Failed to obtain the default display object. Code: ' + JSON.stringify(exception));
    }
  }

  pxTovp(num: number, densityDPI: number) {
    let vpValue = num / (densityDPI / 160)
    console.log(`使用 pxTovp 将${num} px 转换为 vp单位 结果:${vpValue} vp`)

    let vpValue2 = this.getUIContext().px2vp(num)
    console.log(`使用 HarmonyOS 封装的 px2vp 方法 将${num} px 转换为 vp单位 结果:${vpValue2} vp`)
  }

  build() {
    Column({ space: 10 }) {
      Text(this.message)
        .id('TestDisplayHelloWorld')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
      Button('获取屏幕密度')
        .fontColor(Color.Black)
        .fontSize(20)
        .fontWeight(FontWeight.Medium)
        .onClick(() => {
          this.getDPI()
        })
      Text(`屏幕密度: ${this.deviceDPI}`)
        .fontSize(20)
        .fontColor(Color.Black)
        .fontWeight(FontWeight.Medium)
    }
    .height('100%')
    .width('100%')
  }
}

如果原型图没有提供vp单位的布局,开发者可以根据densityPixel把px转为vp,HarmonyOS也封装了现成的接口px2vp()和vp2px()供开发者直接调用。

三、参考链接

HarmonyOS:像素单位


http://www.kler.cn/a/612858.html

相关文章:

  • Vue3.X项目中包依赖的解析与安装出现问题如何解决?
  • “头”里有什么——HTML 元信息
  • 2025年湖南建筑安全员B证备考资料
  • 数据库基础(聚合函数 分组 排序)
  • 【数据结构】C语言实现并查集:双亲指针映射与动态连通性实现详解
  • Go 语言标准库中sort模块详细功能介绍与示例
  • 【学Rust写CAD】16 零标记类型(zero.rs)
  • LogitsProcessor代码分析
  • 3.28日,NBA,欧篮联全扫盘,太阳VS森林狼
  • 小林coding-10道Java集合面试题
  • 深入理解 dispatchEvent:前端事件触发的艺术
  • DPO介绍+公式推理
  • C++中的智能指针
  • Spring Boot深度解析:从核心原理到最佳实践
  • 美颜SDK架构解析:如何高效处理人脸美型的计算任务?
  • kubernetes》》k8s》》 kubeadm、kubectl、kubelet
  • [原创](Modern C++)现代C++的关键性概念: 如何利用多维数组的指针安全地遍历所有元素
  • NoSQL 数据库的适用场景与局限性分析
  • 7.5考研408数据结构散列表专题深度解析
  • Java EE 进阶:MyBatis-plus