Harmony OS“一多” 详解:基于窗口变化的断点自适应实现

一、一多开发核心概念(1+8+N模式)

        目标:一次开发多端部署 解决的问题:
                1、界面级一多:适配不同屏幕尺寸
                2、功能级一多:设备功能兼容性处理(CanIUser)
                3、工程级一多:项目架构管理(三成架构HAP、HAR、HSP)

二、界面级一多解决方法

1、自适应布局

能力

核心属性/组件

代码示例

拉伸

flexGrow/flexShrink

.flexGrow(1).flexShrink(1)

均分

justifyContent: SpaceEvenly

Row().justifyContent(FlexAlign.SpaceEvenly)

占比

layoutWeight 或百分比宽高

.width('50%').layoutWeight(1)

缩放

aspectRatio

.aspectRatio(1.5)

延伸

List/Scroll + Row

List().listDirection(Axis.Horizontal)

隐藏

displayPriority

.displayPriority(2)

折行

FlexWrap.Wrap

Flex({ wrap: FlexWrap.Wrap })

2、响应式布局

        2-1、断点系统

断点

范围(vp)

典型设备

xs

[0, 320)

智能手表

sm

[320, 600)

手机竖屏

md

[600, 840)

折叠屏/横屏

lg

[840, +∞)

平板/PC

// 在Ability中监听窗口变化
windowObj.on('windowSizeChange', (size) => {const widthVp = size.width / density;AppStorage.set('currentBreakpoint', calculateBreakpoint(widthVp));
});

2-2、媒体查询

// 创建监听器
const listener = mediaquery.matchMediaSync('(320vp<=width<600vp)');
// 注册回调
listener.on('change', (res) => {if (res.matches) AppStorage.set('breakpoint', 'sm');
});
// 移除监听
listener.off('change');

2-3栅格布局

GridRow({columns: { sm: 4, md: 8, lg: 12 },gutter: 10
})
/*--------------------------------------------*/
//GridRow:定义行布局规则
GridRow({columns: { sm: 4, md: 8, lg: 12 },gutter: 10
})
/*--------------------------------------------*/
//GridCol:定义列占比与偏移
GridCol({span: { sm: 2, md: 4 },offset: { md: 1 }
})

场景

推荐方案

优势

微调元素尺寸

自适应布局(占比/拉伸)

简单高效,代码侵入性低

多设备显隐逻辑

响应式布局(媒体查询)

精确控制不同断点下的UI表现

复杂多列布局

栅格系统

内置响应规则,维护性强

全局断点状态管理

BreakpointSystem工具

统一管理断点,避免重复监听

3、界面级一多断点
import window from '@ohos.window'
import display from '@ohos.display'
import UIAbility from '@ohos.app.ability.UIAbility'export default class EntryAbility extends UIAbility {private windowObj?: window.Windowprivate curBp: string = ''//...// 根据当前窗口尺寸更新断点private updateBreakpoint(windowWidth: number) :void{// 将长度的单位由px换算为vplet windowWidthVp = windowWidth / display.getDefaultDisplaySync().densityPixelslet newBp: string = ''if (windowWidthVp < 320) {newBp = 'xs' // 超小屏} else if (windowWidthVp < 600) {newBp = 'sm' // 小屏} else if (windowWidthVp < 840) {newBp = 'md' // 中屏} else {newBp = 'lg' // 大屏}if (this.curBp !== newBp) {this.curBp = newBp// 使用状态变量记录当前断点值AppStorage.setOrCreate('currentBreakpoint', this.curBp)}}onWindowStageCreate(windowStage: window.WindowStage) :void{windowStage.getMainWindow().then((windowObj) => {this.windowObj = windowObj// 获取应用启动时的窗口尺寸this.updateBreakpoint(windowObj.getWindowProperties().windowRect.width)// 注册回调函数,监听窗口尺寸变化windowObj.on('windowSizeChange', (windowSize)=>{this.updateBreakpoint(windowSize.width)})});// ...}//...
}
  1. 技术栈
    • 鸿蒙特定 API:基于鸿蒙系统的@ohos.window@ohos.display@ohos.app.ability.UIAbility模块进行开发,充分利用鸿蒙系统提供的窗口管理、显示信息获取以及应用能力相关的原生 API。
  2. 核心点
    • 窗口尺寸监听:在onWindowStageCreate方法中,通过windowStage.getMainWindow().then获取主窗口对象,随后利用windowObj.on('windowSizeChange', ...)注册回调函数,实时监听窗口尺寸变化,这是实现屏幕适配的关键起始步骤。
    • 断点计算与更新updateBreakpoint方法将获取到的窗口宽度从像素(px)换算为虚拟像素(vp),根据不同的vp范围确定对应的断点值(xssmmdlg)。当计算出的新断点与当前断点不同时,更新当前断点并通过AppStorage.setOrCreate方法记录在状态变量中,以便应用其他部分根据断点值进行不同的布局或功能调整。

三、总结 

        本文围绕 “一多开发” 这一核心概念展开,着重探讨了其在界面级的实现方式。“一多开发” 旨在达成一次开发多端部署,解决界面、功能及工程等层面的适配与管理问题。

        在界面级,通过自适应布局、响应式布局两种主要方式实现对不同屏幕尺寸的适配。自适应布局借助如flexGrowjustifyContent等多种属性和组件,能简单高效地微调元素尺寸;响应式布局则通过断点系统、媒体查询和栅格布局,可更精准地控制不同设备下的 UI 表现,满足多设备显隐逻辑和复杂多列布局等场景需求。

        结合提供的鸿蒙开发代码示例,其基于鸿蒙特定 API 实现了窗口尺寸监听与断点计算更新,这是界面适配的关键技术点。通过监听窗口变化获取尺寸信息,换算为vp后确定断点值并记录,为应用根据不同屏幕尺寸调整布局和功能提供依据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMvc获取请求数据

基本参数 RequestMapping("save5") ResponseBody public User save5(String name, int age) {User user new User();user.setName(name);user.setAge(age);return user; } 在url中将name与age进行编写&#xff0c;通过框架可以提取url中的name与age&#xff0c;这…

大模型持续学习方案解析:灾难性遗忘的工业级解决方案

引言 随着大型语言模型&#xff08;LLMs&#xff09;如 GPT 系列、BERT 等在自然语言处理领域取得突破性进展&#xff0c;它们强大的理解和生成能力已经渗透到各行各业。然而&#xff0c;这些模型通常是在海量静态数据集上进行一次性预训练的。现实世界是动态变化的&#xff0…

推荐系统(二十二):基于MaskNet和WideDeep的商品推荐CTR模型实现

在上一篇文章《推荐系统&#xff08;二十一&#xff09;&#xff1a;基于MaskNet的商品推荐CTR模型实现》中&#xff0c;笔者基于 MaskNet 构建了一个简单的模型。笔者所经历的工业级实践证明&#xff0c;将 MaskNet 和 Wide&Deep 结合应用&#xff0c;可以取得不错的效果&…

【爬虫案例】采集 Instagram 平台数据几种方式(python脚本可直接运行)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、概述1.1 Instagram基础信息1.2 Instagram平台架构核心技术栈1.3 采集提示1.4 几种采集方案对比二、四种采集方案分析三、写爬虫采集Instagram案例3.1 采集作品信息并下载视频或图片(无需登录)3.2 explore接口的采…

OFP--2018

文章目录 AbstractIntroductionRelated Work2D object detection3D object detection from LiDAR3D object detection from imagesIntegral images 3D Object Detection ArchitectureFeature extractionOrthographic feature transformFast average pooling with integral imag…

LINUX 4 tar -zcvf -jcvf -Jcvf -tf -uf

cp -r mv: 1.移动文件到目录 2.文件改名 3.目录改名 s 上面是打包 下面是打包并压缩

linux signal up/down/down_interruptiable\down_uninterruptiable使用

在Linux内核中&#xff0c;down, down_interruptible, down_killable, 和 up 是用于操作信号量&#xff08;semap hores&#xff09;的函数&#xff0c;它们用于进程同步和互斥。以下是对这些函数的简要说明。 1&#xff0c;down(&sem): 这个函数用于获取信号量。如果信号…

使用人工智能大模型DeepSeek,如何进行论文润色和去重?

今天我们学习人工智能&#xff0c;如何协助我们进行论文润色和去重。手把手的学习视频地址请访问https://edu.csdn.net/learn/40402/666422 第一步在腾讯元宝对话框中输入如何协助老师做论文润色&#xff0c;通过提问&#xff0c;我们了解了老师写论文润色的步骤和建议。润色的…

UE5 Simulation Stage

首先将Grid2D创建出来&#xff0c;然后设置值&#xff0c;Grid2D类似于在Niagara系统中的RenderTarget2D&#xff0c;可以进行绘制&#xff0c;那么设置大小为512 * 512 开启Niagara粒子中的Simulation Stage 然后开始编写我们的自定义模块 模块很简单&#xff0c;TS就是Textur…

OpenCV 图形API(6)将一个矩阵(或图像)与一个标量值相加的函数addC()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 addC 函数将给定的标量值加到给定矩阵的每个元素上。该功能可以用矩阵表达式替换&#xff1a; dst src1 c \texttt{dst} \texttt{src1} \te…

多GPU训练

写在前面 限于财力不足&#xff0c;本机上只有一个 GPU 可供使用&#xff0c;因此这部分的代码只能够稍作了解&#xff0c;能够使用的 GPU 也只有一个。 多 GPU 的数据并行&#xff1a;有几张卡&#xff0c;对一个小批量数据&#xff0c;有几张卡就分成几块&#xff0c;每个 …

0基础 | 硬件 | 电源系统 一

降压电路LDO 几乎所有LDO都是基于此拓扑结构 图 拓扑结构 LDO属于线性电源&#xff0c;通过控制开关管的导通程度实现稳压&#xff0c;输出纹波小&#xff0c;无开关噪声 线性电源&#xff0c;IoutIin&#xff0c;发热功率P电压差△U*电流I&#xff0c;转换效率Vo/Vi LDO不适…

mysql数据库中getshell的方式总结

mysql数据库中getshell的方式总结 MySQL版本大于5.0&#xff0c;MySQL 5.0版本以上会创建日志文件,我们通过修改日志文件的全局变量,就可以GetSHELL,下面这篇文章主要给大家介绍了关于mysql数据库中getshell的方式,需要的朋友可以参考下 outfile和dumpfile写shell 利用条件 …

基于Python的微博数据采集

摘要 本系统通过逆向工程微博移动端API接口,实现了对热门板块微博内容及用户评论的自动化采集。系统采用Requests+多线程架构,支持递归分页采集和动态请求头模拟,每小时可处理3000+条数据记录。关键技术特征包括:1)基于max_id的评论分页递归算法 2)HTML标签清洗正则表达…

WiFi加密协议

目录 1. 认证(Authentication)‌ ‌1.1 开放系统认证(Open System Authentication)‌ 1.2 共享密钥认证(Shared Key Authentication)‌ ‌1.3 802.1X/EAP认证(企业级认证)‌ ‌2. 关联(Association)‌ ‌3. 加密协议(Security Handshake)‌ ‌整体流程总结‌…

MySQL篇(六)MySQL 分库分表:应对数据增长挑战的有效策略

MySQL篇&#xff08;六&#xff09;MySQL 分库分表&#xff1a;应对数据增长挑战的有效策略 MySQL篇&#xff08;六&#xff09;MySQL 分库分表&#xff1a;应对数据增长挑战的有效策略一、引言二、为什么需要分库分表2.1 性能瓶颈2.2 存储瓶颈2.3 高并发压力 三、分库分表的方…

极限编程(XP)简介及其价值观与最佳实践

目录 一、什么是极限编程&#xff08;XP&#xff09;二、极限编程的核心价值观1. 沟通2. 简单3. 反馈4. 勇气 三、极限编程的12个最佳实践1. 结对编程2. 40小时工作制3. 简单设计4. 代码规范5. 测试驱动开发&#xff08;TDD&#xff09;6. 系统隐喻7. 持续集成8. 重构9. 客户在…

Java进阶-day06:反射、注解与动态代理深度解析

目录 一、反射机制&#xff1a;Java的自我认知能力 1.1 认识反射 1.2 获取Class对象 1.3 获取类的成分 二、注解&#xff1a;Java的元数据机制 2.1 注解概述 2.2 元注解 2.3 注解解析 2.4 注解的实际应用 三、动态代理&#xff1a;灵活的间接访问机制 3.1 为什么需要…

Nacos注册中心AP模式核心源码分析(集群模式)

文章目录 概述一、客户端新注册实例信息在集群间同步二、服务端集群节点信息在集群间同步2.1、DistroMapper2.2、ProtocolManager2.3、ServerListManager2.4、RaftPeerSet 三、客户端实例状态信息在集群间同步四、服务端新节点上线同步集群数据 概述 在Nacos集群模式下&#xf…

vscode和cursor对ubuntu22.04的remote ssh和X-Windows的无密码登录

这里写自定义目录标题 写在前面需求的描述问题的引出 昨天已使能自动登录上午我的改变UBUNTU 22.04关闭密码规则一&#xff1a;修改 /etc/pam.d/common-password 文件二&#xff1a;修改 /etc/security/pwquality.conf 文件方法三&#xff1a;禁用 pam_pwquality.so 模块 vscod…