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

《HarmonyOS技术精讲-窗口管理》第七篇:窗口事件处理与焦点管理

《HarmonyOS技术精讲-窗口管理》第七篇:窗口事件处理与焦点管理

事件响应与焦点:掌握 HarmonyOS 窗口生命周期中的关键事件监听

一、前言

在 HarmonyOS 应用开发过程中,窗口(Window)不仅仅是承载 UI 的容器,它还负责管理应用与用户之间的交互状态。

例如:

  • 用户点击不同窗口时,需要知道当前哪个窗口获得焦点;
  • 应用进入后台时,需要暂停视频播放、释放资源;
  • 应用重新显示时,需要恢复数据和刷新界面;
  • 分屏、多窗口场景下,需要根据窗口大小动态调整布局。

这些场景都依赖窗口事件监听机制。

HarmonyOS 提供了丰富的 Window 事件能力,开发者可以通过监听窗口状态变化,实现更加智能的交互体验。

本文重点介绍三个常用窗口事件:

  • focusChange:窗口焦点变化事件
  • windowVisibilityChange:窗口显示隐藏事件
  • windowSizeChange:窗口大小变化事件

二、窗口事件处理基础

在 HarmonyOS Stage 模型中,我们通常通过WindowStage获取当前应用窗口。

基本流程:

应用启动 → 创建 WindowStage → 获取 Window 对象 → 注册事件监听 → 响应窗口变化

示例:

import{window}from'@kit.ArkUI';import{UIAbility}from'@kit.AbilityKit';exportdefaultclassEntryAbilityextendsUIAbility{onWindowStageCreate(windowStage:window.WindowStage){windowStage.getMainWindow().then((win)=>{console.info("窗口创建成功");this.registerWindowListener(win);});}registerWindowListener(win:window.Window){console.info("开始监听窗口事件");}}

获取到window.Window对象后,就可以监听各种窗口状态变化。


三、监听窗口焦点事件 focusChange

1. 什么是窗口焦点?

焦点代表当前窗口是否处于用户交互状态。

例如:

用户打开应用:

窗口获得焦点 → 接收用户输入 → 响应点击操作

当用户打开其他窗口:

原窗口失去焦点 → 暂停交互

在多窗口、悬浮窗场景中,焦点管理非常重要。


2. 监听焦点变化

HarmonyOS 提供focusChange事件监听窗口焦点状态。

win.on('focusChange',(isFocused)=>{if(isFocused){console.info("当前窗口获得焦点");}else{console.info("当前窗口失去焦点");}});

参数说明:

参数说明
true窗口获得焦点
false窗口失去焦点

四、实战:两个窗口焦点联动

下面实现一个实际案例:

需求:

创建两个窗口:

窗口 A:

  • 获得焦点时改变背景颜色

窗口 B:

  • 失去焦点时隐藏

实现效果:

窗口 A 获得焦点 → 更新背景

窗口 B 失去焦点 → 自动隐藏


创建窗口管理类

import{window}from'@kit.ArkUI';exportclassWindowManager{privatemainWindow?:window.Window;privatesecondWindow?:window.Window;asyncinit(context){this.mainWindow=awaitwindow.getLastWindow(context);this.registerMainWindowEvent();}registerMainWindowEvent(){this.mainWindow?.on('focusChange',(focus)=>{if(focus){console.info("主窗口获得焦点");this.changeBackground();}});}changeBackground(){console.info("改变窗口背景颜色");}}

第二窗口监听焦点

secondWindow.on('focusChange',(focus)=>{if(!focus){console.info("第二窗口失去焦点");secondWindow.hide();}});

这种方式可以实现:

  • 悬浮聊天窗口
  • 视频小窗
  • 工具面板
  • 多窗口协同

五、监听窗口显示隐藏事件

除了焦点变化,窗口显示状态也是非常重要的生命周期事件。

例如:

用户离开页面:

窗口隐藏 → 暂停动画 → 停止定位 → 释放资源

用户返回:

窗口显示 → 恢复状态 → 加载数据

监听代码:

win.on('windowVisibilityChange',(visible)=>{if(visible){console.info("窗口显示");loadResource();}else{console.info("窗口隐藏");releaseResource();}});

实际应用场景:视频播放

窗口隐藏:

functionreleaseResource(){console.info("暂停视频播放");}

窗口显示:

functionloadResource(){console.info("恢复视频播放");}

可以避免后台运行导致:

  • CPU 占用增加
  • 网络浪费
  • 电量消耗

六、监听窗口大小变化事件 windowSizeChange

HarmonyOS 支持多种设备形态:

  • 手机
  • 平板
  • 电脑
  • 折叠屏

窗口尺寸可能动态变化。

例如:

全屏 → 分屏 → 重新布局

监听代码:

win.on('windowSizeChange',(size)=>{console.info(`窗口大小:${size.width}x${size.height}`);});

七、根据窗口大小动态调整布局

例如:

手机:

单列布局

平板:

左右双栏布局

代码:

win.on('windowSizeChange',(size)=>{if(size.width<600){console.info("切换手机布局");}else{console.info("切换平板布局");}});

通过窗口尺寸变化,可以实现:

  • 自适应 UI
  • 横竖屏适配
  • 折叠屏适配

八、完整窗口事件管理示例

import{window}from'@kit.ArkUI';exportclassAppWindowController{privatewin?:window.Window;init(win:window.Window){this.win=win;this.bindEvent();}bindEvent(){this.win?.on('focusChange',(focus)=>{if(focus){console.info("窗口激活");}else{console.info("窗口暂停交互");}});this.win?.on('windowVisibilityChange',(visible)=>{if(visible){this.resume();}else{this.pause();}});this.win?.on('windowSizeChange',(size)=>{console.info("窗口尺寸变化",size.width,size.height);});}resume(){console.info("恢复资源");}pause(){console.info("释放资源");}}

九、开发注意事项

1. 及时移除监听

长期监听可能导致资源泄漏。

销毁时:

win.off('focusChange');

2. 避免事件中执行耗时任务

不要:

焦点变化 → 大量数据加载 → 页面卡顿

推荐:

焦点变化 → 异步任务 → 更新状态


3. 不要假设窗口创建后一定获得焦点

多窗口环境下:

创建窗口 ≠ 获得焦点

应该通过:

focusChange

实时判断。


十、总结

本篇学习了 HarmonyOS 窗口事件管理。

核心知识点:

focusChange

监听窗口焦点变化。

适用于:

  • 用户交互控制
  • 多窗口协同
  • 悬浮窗管理

windowVisibilityChange

监听窗口显示隐藏。

适用于:

  • 生命周期管理
  • 资源释放
  • 数据恢复

windowSizeChange

监听窗口大小变化。

适用于:

  • 分屏适配
  • 折叠屏适配
  • 多设备布局

掌握窗口事件监听后,可以让 HarmonyOS 应用在不同设备形态和复杂交互场景下保持稳定运行。


示例代码项目地址:项目地址

http://www.cnnetsun.cn/news/3038261.html

相关文章:

  • 瑞萨RA8M2 SSIE寄存器深度解析:中断与FIFO控制实战指南
  • RA8M2 SDHI寄存器深度解析:中断、时钟与数据传输配置实战
  • 瑞萨RA8M1 GPT定时器PWM生成原理与配置详解
  • 报名失败?92.6%源于这4个被忽略的细节(附2024最新报名系统截图标注版)
  • 瑞萨RA8M1 USBFS寄存器深度解析:从PID、PBUSY到实战配置
  • 5分钟掌握:如何高效使用faster-whisper-GUI实现精准音频转文字
  • 如何在Windows上轻松管理MIFARE Classic卡片:MifareOneTool完整指南
  • RA8D2双核MCU深度解析:从Cortex-M85/M33架构到嵌入式开发实战
  • 终极指南:使用MifareOneTool轻松管理MIFARE Classic卡片
  • RA8D2微控制器GPT中断跳过机制:硬件级中断过滤与CPU负载优化实战
  • 软考报名条件终极对照手册(含2024年各省差异清单+跨行业工龄认定白皮书)
  • 为什么你需要微信聊天记录永久保存:面向普通用户的完整解决方案
  • 微信聊天记录永久保存指南:如何轻松备份你的数字记忆
  • 软考上半年考试科目深度解析(含22个子模块通过率数据+命题趋势图谱)
  • 2026深度实测|Cursor中文Vibe Coding平替权威推荐,AI口述迭代能力全对比
  • 5步构建智能决策大屏:零代码可视化平台实战指南
  • VisualCppRedist AIO:告别DLL地狱,Windows软件依赖问题的终结者
  • Windows程序运行救星:Visual C++运行库全家桶
  • 【无人机跟踪】基于矢量场的路径跟随算法的反正弦矢量场制导下无人机路径跟踪附matlab代码
  • VisualCppRedist AIO技术解析:Windows系统运行库统一管理方案
  • 软考电子证书PDF文件被拒收?HR最常退件的6类元数据错误(含Adobe Acrobat专业修复脚本)
  • 一键解决Windows软件运行问题:Visual C++运行库全家桶完全指南
  • 通达信牛起点指标{}
  • 【软考含金量权威报告】:2024年工信部/人社部数据揭秘:哪3类证书薪资涨幅超37%?
  • 三步掌握暗黑破坏神2存档编辑器:终极角色管理工具使用指南
  • KeepHQ:从警报混乱到智能运维,开源AIOps平台如何重塑企业监控体验
  • 软考中高级证书含金量真相(HR总监内部评估清单首次公开)
  • 5分钟快速上手Markdown Viewer:浏览器中完美渲染Markdown文件的终极解决方案
  • 软考通过率提升秘籍:90%考生忽略的“时间权重分配表”,考前72小时必看
  • m4s-converter:3步永久保存B站缓存视频的终极解决方案