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

news2025/4/6 8:40:01

一、一多开发核心概念(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.Window
  private curBp: string = ''
  //...
  // 根据当前窗口尺寸更新断点
  private updateBreakpoint(windowWidth: number) :void{
    // 将长度的单位由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 (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.coloradmin.cn/o/2329096.html

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

相关文章

【算法竞赛】状态压缩型背包问题经典应用(蓝桥杯2019A4分糖果)

在蓝桥杯中遇到的这道题&#xff0c;看上去比较普通&#xff0c;但其实蕴含了很巧妙的“状态压缩 背包”的思想&#xff0c;本文将从零到一&#xff0c;详细解析这个问题。 目录 一、题目 二、思路分析&#xff1a;状态压缩 最小覆盖 1. 本质&#xff1a;最小集合覆盖问题…

常微分方程 1

slow down and take your time 定积分应用回顾常微分方程的概述一阶微分方程可分离变量齐次方程三阶线性微分方程 一阶线性微分方程不定积分的被积分函数出现了绝对值梳理微分方程的基本概念题型 1 分离变量题型 2 齐次方程5.4 题型 3 一阶线性微分方程知识点5.55.6 尾声 定积分…

Web前端页面搭建

1.在D盘中创建www文件 cmd进入窗口命令windowsR 切换盘符d: 进入创建的文件夹 在文件夹里安装tp框架 在PS中打开tp文件 创建网站&#xff0c;根目录到public 在浏览器中打开网页 修改文件目录名称 在public目录中的。htaccess中填写下面代码 <IfModule mod_rewrite.c >…

开源 LLM 应用开发平台 Dify 全栈部署指南(Docker Compose 方案)

开源 LLM 应用开发平台 Dify 全栈部署指南&#xff08;Docker Compose 方案&#xff09; 一、部署环境要求与前置检查 1.1 硬件最低配置 组件要求CPU双核及以上内存4GB 及以上磁盘空间20GB 可用空间 1.2 系统兼容性验证 ✅ 官方支持系统&#xff1a; Ubuntu 20.04/22.04 L…

BN 层的作用, 为什么有这个作用?

BN 层&#xff08;Batch Normalization&#xff09;——这是深度神经网络中非常重要的一环&#xff0c;它大大改善了网络的训练速度、稳定性和收敛效果。 &#x1f9e0; 一句话理解 BN 层的作用&#xff1a; Batch Normalization&#xff08;批归一化&#xff09;通过标准化每一…

金仓数据库KCM认证考试介绍【2025年4月更新】

KCM&#xff08;金仓认证大师&#xff09;认证是金仓KES数据库的顶级认证&#xff0c;学员需通过前置KCA、KCP认证才能考KCM认证。 KCM培训考试一般1-2个月一次&#xff0c;KCM报名费原价为1.8万&#xff0c;当前优惠价格是1万&#xff08;趋势是&#xff1a;费用越来越高&…

如何通过句块训练法(Chunks)提升英语口语

真正说一口流利英语的人&#xff0c;并不是会造句的人&#xff0c;而是擅长“调取句块”的人。下面我们从原理、方法、场景、资源几个维度展开&#xff0c;告诉你怎么用“句块训练法&#xff08;Chunks&#xff09;”快速提升英语口语&#xff1a; 一、什么是“句块”&#xff…

[ctfshow web入门]burpsuite的下载与使用

下载 吾爱破解网站工具区下载burpsuite https://www.52pojie.cn/thread-1544866-1-1.html 本博客仅转载下载链接&#xff0c;下载后请按照说明进行学习使用 打开 配置 burpsuite配置 burpsuite代理设置添加127.0.0.1:8080 浏览器配置 如果是谷歌浏览器&#xff0c;打开win…

vscode集成deepseek实现辅助编程(银河麒麟系统)【详细自用版】

针对开发者用户&#xff0c;可在Visual Studio Code中接入DeepSeek&#xff0c;实现辅助编程。 可参考我往期文章在银河麒麟系统环境下部署DeepSeek&#xff1a;基于银河麒麟桌面&&服务器操作系统的 DeepSeek本地化部署方法【详细自用版】 一、前期准备 &#xff08…

elementui的默认样式修改

今天用element ui &#xff0c;做了个消息提示&#xff0c;发现提示的位置总是在上面&#xff0c;如图&#xff1a; 可是我想让提示的位置到下面来&#xff0c;该怎么办&#xff1f; 最后还是看了官方的api 原来有个自定义样式属性 customClass 设置下就好了 js代码 css代码 效…

基于STM32的智能门禁系统设计与实现

一、项目背景与功能概述 在物联网技术快速发展的今天&#xff0c;传统门锁正在向智能化方向演进。本系统基于STM32F103C8T6微控制器&#xff0c;整合多种外设模块&#xff0c;实现了一个具备以下核心功能的智能门禁系统&#xff1a; 密码输入与验证&#xff08;4x3矩阵键盘&a…

基于SpringBoot的河道水情大数据可视化分析平台设计与实现(源码+论文+部署讲解等)

需要资料&#xff0c;请文末联系 一、平台介绍 水情监测数据大屏 - 平台首页 日均水位 日均水速 二、论文内容 摘要&#xff08;中文&#xff09; 本文针对河道水情监测领域的数据管理和可视化分析需求&#xff0c;设计并实现了一套河道水情大数据可视化分析平台。该平台基…

广告推荐算法:COSMO算法与A9算法的对比

COSMO算法与A9算法的概念解析 1. A9算法 定义与背景&#xff1a; A9算法是亚马逊早期为电商平台研发的核心搜索算法&#xff0c;主要用于优化商品搜索结果的排序和推荐&#xff0c;其核心逻辑围绕产品属性与关键词匹配展开。自2003年推出以来&#xff0c;A9通过分析商品标题…

【JS】使用滑动窗口得到无重复字符的最长子串

题目 思路 本题采用滑动窗口思想&#xff0c;定义左右指针作为滑动窗口的边界&#xff0c;使用Set数据结构处理重复字符&#xff0c;需要注意的是&#xff1a;每次遍历时采用Math.max方法实时更新最长子串的长度&#xff1b;当左指针移动时&#xff0c;set要删除对应字符。 步…

2025-04-05 吴恩达机器学习4——逻辑回归(1):基础入门

文章目录 1 分类问题1.1 介绍1.2 线性回归与分类1.2 逻辑回归 2 逻辑回归2.1 介绍2.2 Sigmoid 函数2.3 逻辑回归模型 3 决策边界3.1 概念3.2 线性决策边界3.3 非线性决策边界 4 代价函数4.1 不使用平方误差4.2 损失函数4.3 整体代价函数 5 梯度下降5.1 参数更新5.2 逻辑回归 vs…

P1125 [NOIP 2008 提高组] 笨小猴

#include<bits/stdc.h> using namespace std; int a[300],ma,mi105;//数组用来记录每个字符出现的次数&#xff0c;将mi初始为一个比较大的值 bool is_prime(int x){if(x0||x1)return false;for(int i2;i*i<x;i){if(x%i0)return false;}return true; }//判断是否为质…

Linux systemd 服务全面详解

一、systemd 是什么&#xff1f; systemd 是 Linux 系统的现代初始化系统&#xff08;init&#xff09;和服务管理器&#xff0c;替代传统的 SysVinit 和 Upstart。它不仅是系统启动的“总指挥”&#xff0c;还统一管理服务、日志、设备挂载、定时任务等。 核心作用 服务管理…

SortedSet结构之用户积分实时榜单实战

Redis 中的SortedSet结构非常适合用于实现实时榜单的场景&#xff0c;它根据成员的分数自动进行排序&#xff0c;支持高效的添加、更新和查询操作。 SortedSet实时榜单的一些典型应用场景&#xff1a; 游戏中的玩家排行榜&#xff1a;在多人在线游戏中&#xff0c;使用 Sorte…

C++_类和对象(中)

【本节目标】 类的6个默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载const成员函数取地址及const取地址操作符重载 1. 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什…

学习笔记—C++—入门基础()

目录 C介绍 参考文档 C第一个程序 命名空间namespace namespace的价值 namespace的定义 namespace使用 指定命名空间访问 using将命名空间中某个成员展开 展开命名空间中全部成员 输入和输出 缺省参数 函数重载 引用 引用的概念 应用 const引用 指针和引用的关…