HarmonyOS 鸿蒙Next中如何配置应用的屏幕适配?

HarmonyOS 鸿蒙Next中如何配置应用的屏幕适配?

3 回复

方法一,使用栅格布局实现

方法二,自定义封装屏幕断点工具实现

断点工具的封装

通过 display.getDefaultDisplaySync().width 获取主窗口的宽度并将 px 单位转换为 vp。通过 registerListenerScreen 函数在 onWindowStageCreate 生命周期开启屏幕变化监听,首次判断初始屏幕大小,后续窗口变化时也会重新判断;在 onWindowStageDestroy 生命周期调用 unregisterListenerScreen 卸载监听。定义 BreakPointEnum 枚举表示不同屏幕断点,利用 GlobalVariables 类设置全局变量键,judgeScreen 函数根据窗口宽度判断屏幕断点并将结果存于 AppStorage

依赖导入

import { display, window } from '@kit.ArkUI'

获取窗口宽度

通过 display.getDefaultDisplaySync().width 获取主窗口的宽度,但是通过此方法获取到的宽度单位是 px,需要转成 vp

监听屏幕变化

在 Ability 的 onWindowStageCreate 生命周期中开启监听屏幕变化。

// BreakPointUtils.ets
// 开启监听屏幕变化 需要在 Ability 的 onWindowStageCreate 生命周期中调用
async registerListenerScreen(ctx?: Context) {
  // 只调用一次
  this.judgeScreen(px2vp(display.getDefaultDisplaySync().width))
  let mainWindow = await window.getLastWindow(getContext() || ctx)
  mainWindow?.on('windowSizeChange', (size) => {
    // 会调用多次
    this.judgeScreen(px2vp(size.width))
  })
}

// 卸载监听屏幕变化 需要在 Ability 的 onWindowStageDestroy 生命周期中调用
async unregisterListenerScreen(ctx?: Context) {
  let mainWindow = await window.getLastWindow(getContext() || ctx)
    mainWindow?.off('windowSizeChange')
}

判断屏幕大小

全局变量

// GlobalVariables.ets
export class GlobalVariables {
  static readonly BREAK_POINT_KEY: string = 'break_point_key' // 全局变量的key
}

判断屏幕大小

// ScreenManager.ets
// 判断屏幕大小
judgeScreen(width: number) {
  let breakPoint: string = ''
  if (width < 320) {
    breakPoint = BreakPointEnum.xs
  } else if (width >= 320 && width < 520) { // 华为官方于2024.11.05更新了栅格断点值的取值范围
    breakPoint = BreakPointEnum.sm
  } else if (width >= 520 && width < 840) {
    breakPoint = BreakPointEnum.md
  } else {
    breakPoint = BreakPointEnum.lg
  }
  AppStorage.setOrCreate(GlobalVariables.BREAK_POINT_KEY, breakPoint) // 将得到的断点枚举值存到全局状态
}

断点工具封装

封装断点枚举值

// break_point.ets
export enum BreakPointEnum {
  xs = 'xs',
  sm = 'sm',
  md = 'md',
  lg = 'lg'
}

interface 接口类型约束

// break_point.ets
// 使用 interface 接口对断点工具类进行类型约束
interface BreakPointValue<T> {
  xs?: T
  sm?: T
  md?: T
  lg?: T
}

断点工具类

// break_point.ets
export class BreakPointType<T> {
  options: BreakPointValue<T>

  constructor(opt: BreakPointValue<T>) {
    this.options = opt // 把四个断点对应的值给了这个对象
}

获取提供的断点值

// break_point.ets
// 提供一个获取断点值
getValue(breakPoint: string): T {
  //this.options[breakPoint]
  return (this.options as object)[breakPoint] // 此举与下方注释无异
  // if (breakPoint === "xs") {
  //   return this.options.xs!
  // } else if (breakPoint === "sm") {
  //   return this.options.sm!
  // } else if (breakPoint === "md") {
  //   return this.options.md!
  // } else {
  //   return this.options.lg!
  // }
}

更多关于HarmonyOS 鸿蒙Next中如何配置应用的屏幕适配?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


鸿蒙Next应用屏幕适配主要通过资源文件和限定词实现。在resources目录下按屏幕密度创建base、ldpi、mdpi、hdpi等文件夹,放置对应分辨率的图片资源。使用vp和fp作为长度单位确保布局自适应。在config.json中声明supportedSizes字段限定支持的屏幕尺寸。通过媒体查询接口检测屏幕属性动态调整布局,使用响应式布局组件实现不同屏幕尺寸的适配。

在HarmonyOS Next中配置应用屏幕适配,主要通过以下方式实现:

  1. 使用响应式布局
    基于屏幕尺寸和方向动态调整UI,推荐使用自适应网格布局(AdaptiveBoxLayout)和百分比布局(PercentageLayout),结合Display类获取屏幕信息。

  2. 资源文件分级
    resources目录下按屏幕密度(如ldpimdpihdpixhdpi)和屏幕宽度(如smallnormallarge)提供不同资源,系统自动匹配。

  3. 限定符配置
    使用屏幕密度(dpi)和屏幕尺寸(如sw<N>dp)限定符定义布局,例如:

    • layout-sw600dp:适配最小宽度600dp的屏幕
    • layout-land:横屏布局
  4. 单位适配
    使用vp(虚拟像素)和fp(字体像素)替代px,系统会根据屏幕密度自动缩放。例如:

    <Button width="100vp" height="50vp" textSize="20fp"/>
    
  5. 组件自适应能力
    利用GridContainerFlexLayout等容器组件,结合ComponentSizeAUTOPERCENT属性实现动态调整。

  6. 测试与验证
    使用DevEco Studio的预览器切换不同设备型号,或通过ohos.screensize模块的getDefaultDisplay()方法实时获取屏幕参数进行调试。

通过以上配置,可确保应用在不同分辨率和尺寸的鸿蒙设备上保持界面一致性与用户体验流畅性。

回到顶部