文档管理中心
您当前正在浏览新版开发者文档中心,目录分类和层级有所调整。点击左侧当前文档分类名称前的“☰”图标,可切换文档分类。 了解新版目录
问题处理与运维开发与测试问题多设备场景电脑常见问题如何实现PC登录流程的窗口变化效果

如何实现PC登录流程的窗口变化效果

问题现象

如何实现PC登录流程的窗口变化效果?期待的效果是:启动应用时,先出现一个用于登录的小窗,窗口没有标题栏,登录后变为全屏具有标题栏的主界面。

背景知识

  • module.json5配置文件中abilities标签中的startWindowIcon和startWindowBackground分别设置应用启动页的图标和背景颜色。
  • resize用于调整窗口大小。
  • moveWindowTo用于移动窗口位置。
  • setWindowDecorVisible用于设置标题栏是否可见。该接口需要在loadContent()调用生效后使用。
  • setWindowTitleButtonVisible用于设置主窗口标题栏上的最大化、最小化、关闭按钮是否可见。

解决方案

  1. 将module.json5配置文件中abilities标签的startWindowIcon设置为透明图片,startWindowBackground设置为透明背景。这一步可以隐藏应用启动时系统自带的启动页,直接显示用于登录的小窗。
  2. 在EntryAbility.ets文件中的onWindowStageCreate方法中通过resize将窗口尺寸设为小尺寸,并通过moveWindowTo实现居中放置;loadContent执行后通过setWindowDecorVisible和setWindowTitleButtonVisible将标题栏设为隐藏状态。这一步可以初始化窗口形态,用于实现登录用的小窗。
    收起
    自动换行
    深色代码主题
    复制
    1. import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit';
    2. import { hilog } from '@kit.PerformanceAnalysisKit';
    3. import { display, window } from '@kit.ArkUI';
    4. const DOMAIN = 0x0000;
    5. export default class EntryAbility extends UIAbility {
    6. onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    7. console.info(`want: ${want}`);
    8. console.info(`launchParam: ${launchParam}`);
    9. try {
    10. this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
    11. } catch (err) {
    12. hilog.error(DOMAIN, 'testTag', 'Failed to set colorMode. Cause: %{public}s', JSON.stringify(err));
    13. }
    14. hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
    15. }
    16. onDestroy(): void {
    17. hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy');
    18. }
    19. onWindowStageCreate(windowStage: window.WindowStage): void {
    20. AppStorage.setOrCreate('windowStage', windowStage);
    21. const windowClass = windowStage.getMainWindowSync();
    22. windowClass.resize(500, 500);
    23. windowClass.moveWindowTo(display.getDefaultDisplaySync().width / 2 - 250,
    24. display.getDefaultDisplaySync().height / 2 - 250, (err) => {
    25. console.info(`want: ${err}`);
    26. });
    27. // Main window is created, set main page for this ability
    28. hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
    29. windowStage.loadContent('pages/Index', (err) => {
    30. windowClass.setWindowDecorVisible(false);
    31. windowClass.setWindowTitleButtonVisible(false, false, false);
    32. if (err.code) {
    33. hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
    34. return;
    35. }
    36. hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');
    37. });
    38. }
    39. onWindowStageDestroy(): void {
    40. // Main window is destroyed, release UI related resources
    41. hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
    42. }
    43. onForeground(): void {
    44. // Ability has brought to foreground
    45. hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground');
    46. }
    47. onBackground(): void {
    48. // Ability has back to background
    49. hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground');
    50. }
    51. };
  3. 登录后恢复标题栏并将窗口设为全屏。这一步用于实现主界面的全屏窗口。
    收起
    自动换行
    深色代码主题
    复制
    1. import { window } from '@kit.ArkUI';
    2. @Entry
    3. @Component
    4. struct Index {
    5. context: Context | undefined = this.getUIContext().getHostContext();
    6. build() {
    7. RelativeContainer() {
    8. Text('登录')
    9. .id('HelloWorld')
    10. .fontSize($r('app.float.page_text_font_size'))
    11. .fontWeight(FontWeight.Bold)
    12. .alignRules({
    13. center: { anchor: '__container__', align: VerticalAlign.Center },
    14. middle: { anchor: '__container__', align: HorizontalAlign.Center }
    15. })
    16. .onClick(() => {
    17. let windowStage = AppStorage.get('windowStage') as window.WindowStage;
    18. let windowClass: window.Window = windowStage.getMainWindowSync(); // 获取应用主窗口
    19. windowClass.setWindowDecorVisible(true);
    20. windowClass.setWindowTitleButtonVisible(true, true, true);
    21. windowClass.maximize(window.MaximizePresentation.FOLLOW_APP_IMMERSIVE_SETTING);
    22. this.getUIContext().getRouter().pushUrl({ url: 'pages/MainPage', });
    23. });
    24. }
    25. .height('100%')
    26. .width('100%');
    27. }
    28. }
  4. 登录后显示主页面。
    收起
    自动换行
    深色代码主题
    复制
    1. @Entry
    2. @Component
    3. struct MainPage {
    4. message: string = '主界面';
    5. build() {
    6. RelativeContainer() {
    7. Text(this.message)
    8. .id('HelloWorld')
    9. .fontSize($r('app.float.page_text_font_size'))
    10. .fontWeight(FontWeight.Bold)
    11. .alignRules({
    12. center: { anchor: '__container__', align: VerticalAlign.Center },
    13. middle: { anchor: '__container__', align: HorizontalAlign.Center }
    14. });
    15. }
    16. .height('100%')
    17. .width('100%');
    18. }
    19. }