鸿蒙三方库 | harmony-utils之WindowUtil窗口属性与焦点管理详解
前言窗口属性和焦点管理是应用窗口行为控制的基础。通过设置窗口是否可触摸、是否可移动等属性可以实现弹窗遮罩、浮动窗口等高级UI效果。pura/harmony-utils的WindowUtil封装了这些窗口属性管理方法。本文将从API说明、代码实战、进阶用法、常见问题等多个维度进行全面讲解帮助开发者快速掌握并应用到实际项目中。一、WindowUtil窗口属性核心APIWindowUtil提供了以下窗口属性管理方法方法说明参数使用场景setWindowTouchable(enabled)设置窗口是否可触摸boolean加载遮罩、弹窗isWindowTouchable()判断窗口是否可触摸无状态查询setWindowFocusable(enabled)设置窗口是否可聚焦boolean多窗口管理isWindowFocusable()判断窗口是否可聚焦无状态查询1.1 核心特性简洁易用封装复杂API为一行调用降低使用门槛类型安全完整的TypeScript类型定义编译期即可发现错误异常处理内置异常捕获机制避免运行时崩溃灵活控制支持触摸和焦点的独立控制1.2 窗口属性组合方案触摸聚焦效果适用场景可触摸可聚焦正常交互普通页面不可触摸可聚焦遮罩层加载遮罩可触摸不可聚焦背景窗口悬浮窗背景不可触摸不可聚焦完全屏蔽安全锁屏二、完整使用步骤2.1 安装依赖ohpminstallpura/harmony-utils2.2 窗口触摸控制import{WindowUtil}frompura/harmony-utils;Button(禁止触摸).width(100%).onClick((){try{WindowUtil.setWindowTouchable(false);this.result窗口触摸已禁止 \n适用于加载遮罩场景;}catch(e){this.result异常: e;}})Button(恢复触摸).width(100%).onClick((){try{WindowUtil.setWindowTouchable(true);this.result窗口触摸已恢复 ✅;}catch(e){this.result异常: e;}})2.3 窗口焦点控制Button(查询窗口焦点).width(100%).onClick((){try{letfocusableWindowUtil.isWindowFocusable();this.result窗口焦点:${focusable?可聚焦:不可聚焦};}catch(e){this.result异常: e;}})三、完整页面示例import{WindowUtil}frompura/harmony-utils;EntryComponentstruct WindowPropDemo{Stateresult:string;build(){Column({space:12}){Button(查询窗口属性).width(100%).onClick((){try{lettouchableWindowUtil.isWindowTouchable();letfocusableWindowUtil.isWindowFocusable();this.result可触摸:${touchable}\n可聚焦:${focusable};}catch(e){this.result异常: e;}});Text(this.result).fontSize(14).fontColor(#333333)}.padding(16)}}四、进阶用法4.1 加载遮罩实现import{WindowUtil,ToastUtil}frompura/harmony-utils;asyncfunctionloadData(){WindowUtil.setWindowTouchable(false);try{awaitfetchData();ToastUtil.showToast(加载完成);}finally{WindowUtil.setWindowTouchable(true);}}4.2 超时自动恢复functiondisableTouchWithTimeout(timeout:number5000){WindowUtil.setWindowTouchable(false);setTimeout((){WindowUtil.setWindowTouchable(true);},timeout);}五、注意事项触摸禁止禁止触摸后用户无法与窗口交互需提供恢复机制焦点管理多窗口场景下焦点管理尤为重要超时恢复建议设置超时自动恢复触摸避免窗口卡死初始化依赖使用前需确保AppUtil.init()已调用异常恢复在try-finally中确保触摸状态恢复六、常见问题Q1: 禁止触摸后如何恢复调用WindowUtil.setWindowTouchable(true)即可恢复建议在finally块中确保恢复。Q2: 多窗口场景下焦点如何管理每个窗口独立管理焦点子窗口获取焦点时主窗口可能失去焦点。Q3: 禁止触摸后弹窗还能显示吗可以显示弹窗但用户无法通过触摸关闭弹窗建议使用定时自动关闭。Q4: isWindowTouchable()返回false但还能点击可能是子窗口的触摸状态需要确认操作的是正确的窗口。总结WindowUtil的窗口属性管理方法为应用提供了精细的窗口行为控制能力。本文详细介绍了核心API、使用步骤、完整示例、进阶用法以及常见问题的解决方案。合理使用触摸和焦点控制可以实现加载遮罩、弹窗等高级UI效果。本文基于pura/harmony-utils工具库更多功能请参考官方文档与后续系列文章。