鸿蒙中封装一个用于管理window窗口的类
思路:
代码:
export class WinManager { context?: Context // 给ability使用 private winNames: string[] = [] // 所有子窗口的名字 // windows窗口创建 url: 页面路径 width: 窗口的宽度 height: 窗口的高度 async showWin(url: string, width?: number, height?: number) { let name = `win_${util.generateRandomUUID()}` // 说人话就是生成一个随机的id const win = await window.createWindow({ windowType: window.WindowType.TYPE_DIALOG, // 窗口的类型 ctx: this.context || getContext() // 应用上下文信息。 // 应用主窗口与子窗口存在大小限制,默认宽度范围:[320, 1920],默认高度范围:[240, 1920],单位为vp。 // 如果有width并且width大于等于320 有height height大于等于240 就设置窗口的大小 if (width && width >= 320 && height && height >= 240) { const screen = display.getDefaultDisplaySync() // 获取Display实例 let mainWidth = vp2px(width) // 窗口大小单位要px!! 所以转一下 let mainHeight = vp2px(height) win.resizeAsync(mainWidth, mainHeight) win.moveWindowToAsync((screen.width - mainWidth) / 2, (screen.height - mainHeight) / 2) await win.showWindow() // 展示窗口 win.setUIContent(url) // 设置地址 this.winNames.push(name) // 将窗口的名字添加到数组中 return name // 返回窗口的名字 return "" // 如果没有url 就返回空字符串 // name: 窗口的名字 不传默认清空所有子窗口 async closeWin(name?: string) { window.findWindow(name).destroyWindow() this.winNames = this.winNames.filter(item => item !== name) // 从数组中删除窗口的名字 while (index < this.winNames.length) { await window.findWindow(this.winNames[index]).destroyWindow() this.winNames = [] // 清空数组export const winManger = new WinManager()知识点:
1. 创建窗口window.createWindow
创建子窗口或者系统窗口,返回一个promise对象。
createWindow(config: Configuration): Promise<void>
const win = await window.createWindow({ windowType: window.WindowType.TYPE_DIALOG, // 窗口的类型 ctx: this.context || getContext() // 当前应用上下文信息。拓展上下文模型 BaseContext 区别:
对比维度FA模型Stage模型推出时间HarmonyOS早期版本(API 7)HarmonyOS 3.1(API 9)及之后版本设计目标面向简单应用,强调组件隔离面向复杂应用及多设备场景,优化性能与扩展性ArkTS引擎实例每个组件(如PageAbility)独享一个ArkTS引擎实例,内存占用高多个组件共享同一ArkTS引擎实例,内存占用更低且支持状态共享进程隔离组件运行在独立进程中主进程统一管理,支持多线程但限制自定义进程配置文件使用config.json权限字段为reqPermissions
使用module.json5,权限字段改为requestPermissions,模块化声明更清晰
组件类型分为PageAbility、ServiceAbility、DataAbility分为UIAbility(含界面)和ExtensionAbility(场景化服务),组件化更规范窗口管理窗口与生命周期强耦合窗口管理(WindowStage)与UIAbility生命周期解耦,支持多窗口形态多设备适配适配能力有限原生支持多设备统一生命周期,组件可跨设备迁移和协同后台管理允许应用随意驻留后台严格管控后台进程,禁止随意驻留,防止恶意行为开发方式面向过程开发,代码耦合度较高面向对象开发,代码可读性和维护性更好
2. 设置窗口大小resizeAsync
参数名类型必填说明widthnumber是目标窗口的宽度,单位为pxheightnumber是目标窗口的高度,单位为px
3. 显示当前窗口showWindow
4. 移动窗口位置moveWindowToAsync
win.moveWindowToAsync((screen.width - mainWidth) / 2, (screen.height - mainHeight) / 2)5. 配置窗口内容setUIContent
6. 查找到窗口findWindow
参数名类型必填说明namestring是窗口的name。
7. 销毁当前窗口destroyWindow
window.findWindow(name).destroyWindow()8. 屏幕实例Display
getAllDisplays()、getDefaultDisplaySync()都是获取display实例(当前设备屏幕的信息)
const screen = display.getDefaultDisplaySync() // 获取Display实例详细用法同志们就去官网查吧