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

93.HarmonyOS NEXT窗口管理基础教程:深入理解WindowSizeManager

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦!

HarmonyOS NEXT窗口管理基础教程:深入理解WindowSizeManager

文章目录

  • HarmonyOS NEXT窗口管理基础教程:深入理解WindowSizeManager
    • 1. 窗口管理概述
      • 1.1 基本概念
      • 1.2 WindowSizeManager类解析
    • 2. 核心功能解析
      • 2.1 单例模式实现
      • 2.2 异步窗口获取
      • 2.3 像素转换
    • 3. 实践应用
      • 3.1 基本使用方式
      • 3.2 常见应用场景
    • 4. 最佳实践
      • 4.1 初始化时机
      • 4.2 监听变化
      • 4.3 错误处理
    • 5. 注意事项
    • 6. 调试技巧

1. 窗口管理概述

1.1 基本概念

概念说明使用场景
窗口尺寸应用窗口的宽高信息布局计算、UI适配
物理像素设备实际像素点设备显示
视口像素逻辑显示单位UI开发

1.2 WindowSizeManager类解析

class WindowSizeManager {// 存储窗口尺寸信息private size: window.Size = { width: 0, height: 0 };constructor() {// 获取当前窗口实例window.getLastWindow(getContext()).then((value: window.Window) => {// 获取窗口属性中的矩形信息const rect: window.Rect = value.getWindowProperties().windowRect;// 转换物理像素到视口像素this.size.width = px2vp(rect.width);this.size.height = px2vp(rect.height);console.log(`[windowWidth]${this.size.width} [windowHeight]${this.size.height}`);})}// 获取窗口尺寸get(): window.Size {return this.size;}
}

2. 核心功能解析

2.1 单例模式实现

// 导出单例实例
export const windowSizeManager: WindowSizeManager = new WindowSizeManager();

为什么使用单例模式?

  1. 确保全局只有一个窗口管理器实例
  2. 避免重复创建和资源浪费
  3. 提供统一的访问点

2.2 异步窗口获取

window.getLastWindow(getContext()).then((value: window.Window) => {// 处理窗口信息
})

异步操作的必要性:

  1. 窗口信息可能不会立即可用
  2. 避免阻塞主线程
  3. 确保数据准确性

2.3 像素转换

this.size.width = px2vp(rect.width);
this.size.height = px2vp(rect.height);

px2vp转换的重要性:

  1. 物理像素到视口像素的转换
  2. 确保跨设备显示一致性
  3. 适应不同屏幕密度

3. 实践应用

3.1 基本使用方式

// 获取窗口尺寸
const windowSize = windowSizeManager.get();
console.log(`Window size: ${windowSize.width} x ${windowSize.height}`);

3.2 常见应用场景

场景使用方式示例代码
布局计算获取可用空间const availableWidth = windowSize.width;
居中定位计算居中坐标const centerX = windowSize.width / 2;
响应式布局根据窗口大小调整if (windowSize.width > 600) { ... }

4. 最佳实践

4.1 初始化时机

// 推荐在组件初始化时获取窗口尺寸
aboutToAppear() {const size = windowSizeManager.get();// 使用窗口尺寸进行初始化
}

4.2 监听变化

// 在需要响应窗口变化的地方
onWindowResize(size: window.Size) {// 更新布局或其他处理
}

4.3 错误处理

try {const size = windowSizeManager.get();// 使用尺寸信息
} catch (error) {console.error('Failed to get window size:', error);// 使用默认值或错误处理
}

5. 注意事项

  1. 初始化时序

    • 确保在使用前完成初始化
    • 处理初始值为0的情况
    • 考虑异步加载的影响
  2. 性能考虑

    • 避免频繁获取窗口尺寸
    • 缓存计算结果
    • 合理使用防抖/节流
  3. 兼容性处理

    • 考虑不同设备的差异
    • 处理异常情况
    • 提供降级方案

6. 调试技巧

  1. 日志输出
console.log(`Window size updated: ${this.size.width} x ${this.size.height}`);
  1. 断点调试
  • 在尺寸更新处设置断点
  • 监控异步操作完成
  • 检查转换结果
  1. 错误排查
  • 检查Context是否正确
  • 验证异步操作结果
  • 确认像素转换准确性

通过合理使用WindowSizeManager,可以有效管理应用的窗口尺寸信息,为UI布局和适配提供可靠的基础。在实际开发中,要注意异步操作和像素转换的处理,确保应用在不同设备上都能正常显示。

相关文章:

93.HarmonyOS NEXT窗口管理基础教程:深入理解WindowSizeManager

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT窗口管理基础教程:深入理解WindowSizeManager 文章目录 HarmonyOS NEXT窗口管理基础教程:深入理解WindowSiz…...

Python----数据分析(Pandas一:pandas库介绍,pandas操作文件读取和保存)

一、Pandas库 1.1、概念 Pandas是一个开源的、用于数据处理和分析的Python库,特别适合处理表格类数 据。它建立在NumPy数组之上,提供了高效的数据结构和数据分析工具,使得数据操作变得更加简单、便捷和高效。 Pandas 的目标是成为 Python 数据…...

基于WebRTC技术的EasyRTC嵌入式音视频SDK:多平台兼容与性能优化

在当今数字化、智能化的时代背景下,实时音视频通信技术已成为众多领域不可或缺的关键技术。基于WebRTC技术的EasyRTC嵌入式音视频SDK,凭借其在ARM、Linux、Windows、安卓、iOS等多平台上的兼容性,为开发者提供了强大的工具,推动了…...

【快速入门】MyBatis

一.基础操作 1.准备工作 1&#xff09;引入依赖 一个是mysql驱动包&#xff0c;一个是mybatis的依赖包&#xff1a; <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><vers…...

提升 React 应用性能:使用 React Profiler 进行性能调优

前言 在现代前端开发中&#xff0c;性能优化是一个不可忽视的重要环节。在 React 生态系统中&#xff0c;React Profiler 是一个强大的工具&#xff0c;它可以帮助我们检测和优化应用的性能。 本文将通过通俗易懂的语言介绍 React Profiler 的作用&#xff0c;并展示如何使用它…...

八、Prometheus 静态配置(Static Configuration)

所有的配置都可以用静态配置来监控,只不过用servicemonitor简单,但是域名需要静态配置 如果使用 Prometheus 静态配置(Static Configuration),确实不需要 ServiceMonitor、Service 和 Endpoints,但这也意味着失去了 Kubernetes 自动发现(Service Discovery, SD) 的能力…...

重生之我在学Vue--第16天 Vue 3 插件开发

重生之我在学Vue–第16天 Vue 3 插件开发 文章目录 重生之我在学Vue--第16天 Vue 3 插件开发前言一、插件的作用与开发思路1.1 插件能做什么&#xff1f;1.2 插件开发四部曲 二、开发全局通知插件2.1 插件基础结构2.2 完整插件代码&#xff08;带注释解析&#xff09;2.3 样式文…...

网络VLAN技术详解:原理、类型与实战配置

网络VLAN技术详解&#xff1a;原理、类型与实战配置 1. 什么是VLAN&#xff1f; VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09; 是一种通过逻辑划分而非物理连接隔离网络设备的技术。它允许管理员将同一物理网络中的设备划分为多个独立的广播…...

使用自动导入后,eslint报错 eslint9

前提&#xff1a;使用pnpm create vuelatest创建vue应用&#xff0c;并且在创建项目时就勾选eslint和prettier&#xff0c;不然有些配置还需要手动配&#xff0c;比如解决eslint和prettier的冲突问题 1. 解决使用自动导入后Eslint报错问题 配置vite.config.ts // 自动导入api…...

高德爬取瓦片和vue2使用

1、渲染瓦片地址 <template><div class"command-center"><div id"mapContainer" ref"map" class"mapContainer"/></div> </template><script> import Vue from vue import L from leaflet expor…...

交互式可视化进阶(Plotly Dash构建疫情仪表盘)

这里写目录标题 交互式可视化进阶(Plotly Dash构建疫情仪表盘)1. 引言2. 项目背景与意义3. 数据集生成与介绍4. GPU加速在数据处理中的应用5. 交互式仪表盘构建与Plotly Dash6. PyQt GUI集成与美化7. 工程整体架构8. 部分代码实现9. 代码自查与BUG排查10. 总结与展望交互式可…...

如何选择适合您智能家居解决方案的通信协议?

如何选择适合您智能家居解决方案的通信协议&#xff1f; 在开发智能家居产品时&#xff0c;选择合适的通信协议对于设备的高效运行及其在智能家居系统中的互操作性至关重要。市面上协议众多&#xff0c;了解它们的特性并在做决定前考虑各种因素是非常必要的。以下是一些帮助您…...

如何实现Spring Boot与Oracle数据库的完美对接?

想要在Spring Boot项目中使用Oracle数据库&#xff1f;这可不是一件难事&#xff01;接下来&#xff0c;我将带你一步步走过这个过程&#xff0c;从环境准备到配置&#xff0c;再到实际操作&#xff0c;确保你能够轻松对接Oracle数据库。 环境准备 首先&#xff0c;确保你已经…...

RabbitMQ可靠性进制

文章目录 1.生产者可靠性生产者重连生产者确认小结 2. MQ的可靠性数据持久化LazyQueue小结 3. 消费者的可靠性消费者确认机制消费者失败处理方案业务幂等性唯一消息ID业务判断 兜底方案业务判断 兜底方案 1.生产者可靠性 生产者重连 在某些场景下由于网络波动&#xff0c;可能…...

版本控制器Git(5)

文章目录 前言一、理解标签二、创建标签三、操作标签四、多人协作场景一五、多人协作场景二总结 前言 本篇是最后一篇&#xff0c;主要介绍标签管理有关的内容 一、理解标签 标签定义&#xff1a;在Git中&#xff0c;标签&#xff08;tag&#xff09;是对某次提交&#xff08;c…...

Unity引擎架构介绍及代码示例

Unity是一款跨平台的游戏开发引擎&#xff0c;其强大的功能和灵活的架构使得它成为众多游戏开发者的首选。本文将详细介绍Unity引擎的架构&#xff0c;并通过代码示例展示其在实际开发中的应用。 一、Unity引擎架构概述 Unity引擎的架构可以分为以下几个主要部分&#xff1a; 1…...

【数据分析】读取文件

3. 读取指定列 针对只需要读取数据中的某一列或多列的情况&#xff0c;pd.read_csv()函数提供了一个参数&#xff1a;usecols&#xff0c;将包含对应的columns的列表传入该参数即可。 上面&#xff0c;我们学习了读取 "payment" 和 "items_count" 这…...

Dify使用部署与应用实践

最近在研究AI Agent&#xff0c;发现大家都在用Dify&#xff0c;但Dify部署起来总是面临各种问题&#xff0c;而且我在部署和应用测试过程中也都遇到了&#xff0c;因此记录如下&#xff0c;供大家参考。Dify总体来说比较灵活&#xff0c;扩展性比较强&#xff0c;适合基于它做…...

Java 大视界 -- 基于 Java 的大数据机器学习模型的迁移学习应用与实践(129)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

1.Windows+vscode+cline+MCP配置

文章目录 1.简介与资源2.在windows中安装vscode及Cline插件1. 安装vscode2. 安装Cline插件3. 配置大语言模型3. 配置MCP步骤(windows) 1.简介与资源 MCP官方开源仓库 MCP合集网站 参考视频 2.在windows中安装vscode及Cline插件 1. 安装vscode 2. 安装Cline插件 Cline插件…...

C#的字符串之String类与StringBuilder类区别于适用场景

一、分清楚值类型与引用类型 正确理解值类型与引用类型&#xff0c;可以更好的帮助软件开发人员写出性能更好且正确稳定运行的程序&#xff1a; C#值类型与引用类型区别 区别值类型引用类型定义所有继承自【System.ValueType】类型的都是值类型&#xff08;valueType继承自Sys…...

关于WPS的Excel点击单元格打开别的文档的两种方法的探究【为单元格添加超链接】

问题需求 目录和文件结构如下&#xff1a; E:\Dir_Level1 │ Level1.txt │ └─Dir_Level2│ Level2.txt│ master.xlsx│└─Dir_Level3Level3.txt现在要在master.xlsx点击单元格进而访问Level1.txt、Level2.txt、Level3.txt这些文件。 方法一&#xff1a;“单元格右键…...

conda的基本使用及pycharm里设置conda环境

创建conda环境 conda create --name your_env_name python3.8 把your_env_name换成实际的conda环境名称&#xff0c;python后边的根据自己的需要&#xff0c;选择python的版本。 激活conda环境 conda activate your_env_name 安装相关的包、库 conda install package_name …...

计算机网络-网络规划与设计

基本流程 需求分析—》通信规范分析—》逻辑网络设计—》物理网络设计—》实施阶段 需求分析&#xff1a; 确定需求&#xff0c;包括&#xff1a;业务需求、用户需求、应用需求、计算机平台需求、网络通信需求等。 产物&#xff1a;需求规范 通信规范分析&#xff1a; 现有…...

【QA】建造者模式在Qt有哪些应用

#设计模式 #Qt 一、QDomDocument&#xff08;XML 文档构建&#xff09; 模式角色&#xff1a; Builder&#xff1a;QDomDocument 本身Product&#xff1a;XML 文档对象Director&#xff1a;用户代码通过 QDomDocument 逐步构建文档结构 示例代码&#xff1a; QDomDocument…...

六种最新优化算法(TOC、MSO、AE、DOA、GOA、OX)求解多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码

一、算法简介 &#xff08;一&#xff09;阿尔法进化&#xff08;Alpha Evolution&#xff0c;AE&#xff09;算法 阿尔法进化&#xff08;Alpha Evolution&#xff0c;AE&#xff09;算法是2024年提出的一种新型进化算法&#xff0c;其核心在于通过自适应基向量和随机步长的…...

练习-依依的询问最小值(前缀和差分)

问题描述 依依有个长度为 n 的序列 a&#xff0c;下标从 1 开始。 她有 m 次查询操作&#xff0c;每次她会查询下标区间在[li​,ri​] 的 a 中元素和。她想知道你可以重新排序序列 a&#xff0c;使得这 m 次查询的总和最小。 求你求出 m 次查询总和的最小值。 输入格式 第…...

ctfshow web刷题记录

RCE 第一题 eval代码执行 &#xff1a; 1、使用system 加通配符过滤 ?csystem("tac%20fl*") ; 2、反字节执行 xxx %20 echo 反字节 3、变量转移 重新定义一个变量 让他代替我们执行 4、伪协议玩法 ?cinclude$_GET[1]?>&1php://filter/readc…...

MySQL单表查询大全【SELECT】

山再高&#xff0c;往上攀&#xff0c;总能登顶&#xff1b;路再长&#xff0c;走下去&#xff0c;定能到达。 Mysql中Select 的用法 ------前言------【SELECT】0.【准备工作】0.1 创建一个库0.2 库中创建表0.3 表中加入一些数据 1.【查询全部】2.【查询指定列】2.1查询指定列…...

考研系列-408真题计算机网络篇(18-23)

写在前面 此文章是本人在备考过程中408真题计算机网络部分&#xff08;2018年-2023年&#xff09;的易错题及相应的知识点整理&#xff0c;后期复习也常常用到&#xff0c;对于知识提炼归纳理解起到了很大的作用&#xff0c;分享出来希望帮助到大家~ # 2018 1.停止-等待协议的…...