HarmonyOS 鸿蒙Next栅格布局如何获取当前设备宽度类型

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next栅格布局如何获取当前设备宽度类型 我有一个 GridRow 组件,通过 设置 columns 定义了在不同宽度设备类型下的列数

GridRow({
  columns: {
    xs: 4,
    sm: 4,
    md: 6,
    lg: 7,
    xl: 8,
    xxl: 9
  },
  gutter: { x: 7, y: 6 },
  direction: GridRowDirection.Row
})

问题是在我其他代码里,如何知道当前是什么列数? 需求是我需要补齐 Grid,始终展示满的一行一行。所以我需要知道,比如当前 是 sm 设备,列数是4, 我数据源给了我2个,所以我需要补2个item。

所以如果能知道当前设备是什么宽度类型(xs,sm,etc…),或者有什么办法可以获取 gridRow 的真实 columns 数都可以。


更多关于HarmonyOS 鸿蒙Next栅格布局如何获取当前设备宽度类型的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

sm, md, lg表示对应的窗口断点; columns设置划分的栅格数量,gutter设置每个栅格之间的距离; span设置GridCol占据的栅格数量,offset设置GridCol偏移的栅格数(默认不偏移,左对齐)。

以上代码可以实现界面内容在手机和折叠机(折叠态)占据全部宽度,折叠机(展开态)占据3/4宽度,平板占据1/2宽度,通过设置偏移量来保证内容居中显示。

获取窗口断点 响应式布局是一种自适应的能力,可以令页面的显示效果随窗口尺寸动态变化,栅格布局就是一种基础的响应式布局。

如果需要根据不同的窗口尺寸,设置布局的细节变化(例如:组件位置、对齐方式等),就需要获取当前的屏幕断点,并监听断点的变化。

ArkTS框架提供了两种实现方法:

(1)获取窗口对象并监听窗口尺寸变化: 在Ability的onWindowStageCreate生命周期中注册监听

windowStage.getMainWindow().then((windowObj) => {
  this.windowObj = windowObj;
  // 获取窗口尺寸
  this.updateBreakpoint(windowObj.getWindowProperties().windowRect.width);
  // 监听窗口尺寸变化
  windowObj.on('windowSizeChange', (windowSize) =>{
    this.updateBreakpoint(windowSize.width);
  });
});
// 更新断点
public updateBreakpoint(windowWidth: number) {
  let curBp = AppStorage.get<string>('curBp');
  // 将px换算为vp
  let windowWidthVp = windowWidth / display.getDefaultDisplaySync().densityPixels;
  let newBp: string = '';
  if (windowWidthVp < 320) {
    newBp = 'xs';
  } else if (windowWidthVp < 600) {
    newBp = 'sm';
  } else if (windowWidthVp < 840) {
    newBp = 'md';
  } else {
    newBp = 'lg';
  }
  if (curBp !== newBp) {
    curBp = newBp;
    LogUtils.i(TAG, 'updateBreakpoint to ' + newBp);
    AppStorage.setOrCreate('curBp', curBp);
  }
}

在onWindowStageDestroy生命周期中取消监听

(2)通过媒体查询监听应用窗口尺寸变化

aboutToAppear(): void {
  this.smListener = mediaQuery.matchMediaSync('(320vp<width<=520vp)');
  if (this.smListener.matches) {
  this.updateCurrentBreakpoint('sm');
}
this.smListener.on("change", this.isBreakpointSM);
}
isBreakpointSM = (mediaQueryResult) => {
  if (mediaQueryResult.matches) {
    this.updateCurrentBreakpoint('sm');
  }
}
private updateCurrentBreakpoint(breakpoint: string) {
  if (this.curBp!== breakpoint) {
    this.curBp = 'sm';
    AppStorage.SetOrCreate('curBp', this.curBp);
  }
}
aboutToDisappear (): void { // 取消监听
  this.smListener.off('change', this.isBreakpointSM);
}

以上两种方法都可以得到一个存储断点信息的全局变量,从而根据不同的断点为组件设置不同的属性值

弹窗组件使用单独的builder,一般独立于界面之外,因此也需要根据设备宽度进行适配。

根据UX设计规则,弹窗的位置与所占栅格数量定义为: 直板机:位于窗口底部(距底部12vp)

折叠机与平板:位于窗口中心

在ArkUI中较为常用的是自定义弹窗(CustomDialog),以弹窗创建的代码为例(其他类型弹窗同理)。 其中,

alignment属性控制弹窗的位置,DialogAlignment.Default为默认对齐方式,即距底部12vp;DialogAlignment.Center为居中对齐方式。

gridCount属性控制弹窗宽度所占栅格数量。

代码样例:

alignment: this.getDialogAlignment(this.curBp),

gridCount: this.getDialogGridCount(this.curBp, this.ratio),
public getDialogAlignment (curBp: string) {
  return curBp === 'sm' ? DialogAlignment.Default : DialogAlignment.Center;
}
public getDialogGridCount (curBp: string, ratio: number) {
  if (curBp && ratio) {
    if (curBp === 'sm') {
      return ratio > (9 / 16) ? 3 : 4;
    } else if (curBp === 'md') {
      return ratio > (3 / 4) ? 4 : 5;
    } else if (curBp === 'lg') {
      return ratio > (4 / 3) ? 5 : 6;
    }
  }
  return 4;
}

更多关于HarmonyOS 鸿蒙Next栅格布局如何获取当前设备宽度类型的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)中,Next栅格布局(Grid Layout)获取当前设备宽度类型,通常是通过系统提供的API或布局配置来实现的。由于鸿蒙系统有其独特的开发框架和API,以下是获取设备宽度类型的一般方法:

  1. 使用系统配置API: 鸿蒙系统提供了获取设备屏幕信息的API,你可以使用这些API来获取设备的屏幕宽度、分辨率等,然后根据这些信息判断设备的宽度类型(如小屏、中屏、大屏等)。

  2. 布局配置: 在XML布局文件中,你可以使用不同的布局配置来适配不同宽度的设备。鸿蒙的布局系统支持响应式布局,你可以根据屏幕宽度变化自动调整布局。

  3. 资源适配: 通过资源文件夹(如values-swXXXdp)为不同宽度的设备提供不同的资源文件,从而间接获取并适应设备的宽度类型。

具体实现时,你需要查阅鸿蒙的官方文档,找到对应的API或配置方法。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html,

回到顶部