赞
踩
2
环境搭建
3
代码结构解读
4
登录界面实现沉浸式
5
创建验证码校验子窗口
6
验证成功跳转到首页
7
总结
介绍
本篇Codelab基于窗口能力,实现验证码登录的场景,主要完成以下功能:
登录页面主窗口实现沉浸式。
输入用户名和密码后,拉起验证码校验子窗口。
验证码校验成功后,主窗口跳转到应用首页。
主窗口:应用主窗口用于显示应用界面,会在“任务管理界面”显示。
子窗口:应用子窗口用于显示应用的弹窗、悬浮窗等辅助窗口。
沉浸式:指对状态栏、导航栏等系统窗口进行控制,减少状态栏导航栏等系统界面的突兀感,从而使用户获得最佳体验的能力。
源码下载
环境搭建
我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。
代码结构解读
本篇Codelab只对核心代码进行讲解,对于完整代码,我们会在源码下载或gitee中提供。
No Preview
├──entry/src/main/ets // 代码区
│ ├──common
│ │ ├──bean
│ │ │ ├──GridItem.ets // 首页网格数据实体类
│ │ │ └──VerifyItem.ets // 验证码数据实体类
│ │ ├──constants
│ │ │ └──CommonConstants.ets // 公共常量类
│ │ └──utils
│ │ └──Logger.ets // 公共日志类
│ ├──entryability
│ │ └──EntryAbility.ets // 程序入口类
│ ├──model
│ │ └──WindowModel.ets // 应用后端数据管理类
│ ├──pages
│ │ ├──HomePage.ets // 登录之后的首页
│ │ ├──LoginPage.ets // 登录页面
│ │ ├──SuccessPage.ets // 验证码校验成功页面
│ │ └──VerifyPage.ets // 输入验证码页面
│ └──viewmodel
│ └──WindowViewModel.ets // 应用界面数据管理类
└──entry/src/main/resources // 资源文件目录
登录界面实现沉浸式
在这个章节中,我们需要完成登录界面布局的编写,并实现沉浸式效果。步骤如下:
获取主窗口window实例。
设置主窗口全屏显示。
设置状态栏与导航栏不显示,其中names参数决定状态栏、导航栏显示状态,如需全部显示,该参数设置为['status', 'navigation'];如需隐藏,则设置为空。
Preview
// WindowModel.ets
setMainWindowImmersive() {
// 获取主窗口window实例
this.windowStage.getMainWindow((err, windowClass: window.Window) => {
if (err.code) {
Logger.error(`Failed to obtain the main window. Code:${err.code}, message:${err.message}`);
return;
}
// 设置主窗口全屏显示
windowClass.setWindowLayoutFullScreen(true, (err) => {
if (err.code) {
Logger.error(`Failed to set full-screen mode. Code:${err.code}, message:${err.message}`);
return;
}
});
// 设置状态栏与导航栏不显示
windowClass.setWindowSystemBarEnable([], (err) => {
if (err.code) {
Logger.error(`Failed to set the system bar to be invisible. Code:${err.code}, message:${err.message}`);
return;
}
});
});
}
创建验证码校验子窗口
在这个章节中,我们需要完成验证码界面的编写,并实现输入用户名和密码后,点击验证码按钮,拉起验证码子窗口。步骤如下:
调用windowStage的createSubWindow接口,创建子窗口。
子窗口创建成功后,通过moveWindowTo和resize接口,设置子窗口的位置、大小及相关属性等。
调用setUIContent接口,为子窗口加载对应的验证码校验页面。
调用showWindow接口,显示子窗口。
使用resize接口的相关限制: 1. 应用主窗口与子窗口存在大小限制,宽度范围:[320, 2560],高度范围:[240, 2560],单位为vp。 2. 系统窗口存在大小限制,宽度范围:[0, 2560],高度范围:[0, 2560],单位为vp。 3. 全屏模式窗口不支持该操作。
Preview
// WindowModel.ets
createSubWindow() {
// 创建子窗口
this.windowStage.createSubWindow(CommonConstants.SUB_WINDOW_NAME, (err, data: window.Window) => {
if (err.code) {
Logger.error('Failed to create the window. Cause: ' + JSON.stringify(err));
return;
}
// 获取子窗口实例
this.subWindowClass = data;
// 获取屏幕宽高
let screenWidth = display.getDefaultDisplaySync().width;
let screenHeight = display.getDefaultDisplaySync().height;
// 根据子窗口宽高比计算子窗口宽高
let windowWidth = screenWidth * CommonConstants.SUB_WINDOW_WIDTH_RATIO;
let windowHeight = windowWidth / CommonConstants.SUB_WINDOW_ASPECT_RATIO;
// 计算子窗口起始坐标
let moveX = (screenWidth - windowWidth) / 2;
let moveY = screenHeight - windowHeight;
// 将子窗口移动到起始坐标处
this.subWindowClass.moveWindowTo(moveX, moveY, (err) => {
if (err.code) {
Logger.error('Failed to move the window. Cause:' + JSON.stringify(err));
return;
}
});
// 设置子窗口的宽高
this.subWindowClass.resize(windowWidth, windowHeight, (err) => {
if (err.code) {
Logger.error('Failed to change the window size. Cause:' + JSON.stringify(err));
return;
}
});
// 设置子窗口展示的页面内容
this.subWindowClass.setUIContent(CommonConstants.VERIFY_PAGE_URL, (err) => {
if (err.code) {
Logger.error('Failed to load the content. Cause:' + JSON.stringify(err));
return;
}
// 设置子窗口背景颜色
this.subWindowClass.setWindowBackgroundColor('#00000000');
// 显示子窗口
this.subWindowClass.showWindow((err) => {
if (err.code) {
Logger.error('Failed to show the window. Cause: ' + JSON.stringify(err));
return;
}
});
});
});
}
验证成功跳转到首页
在这个章节中,我们需要完成登录后界面布局的编写,并实现验证成功跳转的功能。主要涉及以下两个方面:
校验成功后,销毁验证码校验子窗口。
通知登录主窗口,跳转到首页。
子窗口使用完毕后,需要调用destroyWindow对其进行销毁。
验证码校验子窗口通过公共事件EventHub通知登录主窗口跳转。首先,在登录主窗口aboutToAppear方法中定义公共事件。
然后,在验证成功后,将子窗口进行销毁,并通过eventHub的emit触发公共事件,跳转到首页。
No Preview
// SuccessPage.ets
aboutToAppear() {
setTimeout(() => {
WindowModel.getInstance().destroySubWindow();
getContext(this).eventHub.emit(CommonConstants.HOME_PAGE_ACTION);
}, CommonConstants.LOGIN_WAIT_TIME);
}
总结
您已经完成了本次Codelab的学习,并了解到以下知识点:
如何实现主窗口沉浸式。
如何创建子窗口,并设置子窗口属性。
主窗口与子窗口之间如何传递信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。