HarmonyOS ウィンドウ管理:NativeWindow によるウィンドウ操作

HarmonyOS のウィンドウ管理機能は、ユーザーに没入感のある体験を提供し、アプリケーションのコンテンツに集中できる環境を実現します。この記事では、主ウィンドウ、サブウィンドウ、フローティングウィンドウの作成と設定方法、およびステータスバー・ナビゲーションバーを非表示にするイマーシブモードの実装について解説します。

主ウィンドウのタッチ可否設定

主ウィンドウのタッチ可否属性は、ユーザーが画面をタップして操作できるかどうかを制御します。モバイルデバイスでは通常、この属性を有効に設定します。

import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';

export default class MainAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage) {
    windowStage.getMainWindow((err, win) => {
      if (err) {
        console.error('Main window acquisition failed:', JSON.stringify(err));
        return;
      }

      // タッチ操作を有効化
      win.setWindowTouchable(true, (touchErr) => {
        if (touchErr) {
          console.error('Failed to enable touch:', JSON.stringify(touchErr));
        } else {
          console.info('Touch enabled successfully.');
        }
      });
    });

    // ページ読み込み
    windowStage.loadContent('pages/Index', (err) => {
      if (err) {
        console.error('Page load failed:', JSON.stringify(err));
      }
    });
  }
}

サブウィンドウの作成と管理

サブウィンドウは、主ウィンドウ内に独立した機能領域を提供します。ダイアログ、ツールパレット、分割ビューなどに活用できます。

import UIAbility from '@ohos.app.ability.UIAbility';

let mainStage: any = null;
let subWin: any = null;

export default class SubWindowAbility extends UIAbility {
  createSubWindow() {
    mainStage.createSubWindow('toolPanel', (err, win) => {
      if (err) {
        console.error('Subwindow creation failed:', JSON.stringify(err));
        return;
      }
      subWin = win;

      // 位置とサイズを設定
      win.moveWindowTo(200, 200, (moveErr) => {
        if (!moveErr) console.info('Window moved.');
      });
      win.resize(400, 300, (resizeErr) => {
        if (!resizeErr) console.info('Window resized.');
      });

      // コンテンツをロードして表示
      win.setUIContent('pages/ToolPanel', (loadErr) => {
        if (!loadErr) {
          win.showWindow((showErr) => {
            if (!showErr) console.info('Subwindow shown.');
          });
        }
      });
    });
  }

  destroySubWindow() {
    if (subWin) {
      subWin.destroyWindow((err) => {
        if (!err) console.info('Subwindow destroyed.');
      });
    }
  }

  onWindowStageCreate(windowStage) {
    mainStage = windowStage;
    // 例として起動時にサブウィンドウを作成(実際はイベント駆動が望ましい)
    this.createSubWindow();
  }

  onWindowStageDestroy() {
    this.destroySubWindow();
  }
}

イマーシブモードの実装

イマーシブモードでは、システムバー(ステータスバー・ナビゲーションバー)を非表示にしてフルスクリーン表示を実現します。

import UIAbility from '@ohos.app.ability.UIAbility';

export default class ImmersiveAbility extends UIAbility {
  onWindowStageCreate(windowStage) {
    windowStage.getMainWindow((err, win) => {
      if (err) {
        console.error('Failed to get main window:', JSON.stringify(err));
        return;
      }

      // システムバーを無効化(空配列で全非表示)
      win.setWindowSystemBarEnable([], (barErr) => {
        if (barErr) {
          console.error('Failed to hide system bars:', JSON.stringify(barErr));
        } else {
          console.info('Immersive mode activated.');
        }
      });
    });

    windowStage.loadContent('pages/FullscreenView', (err) => {
      if (err) console.error('Content load error:', JSON.stringify(err));
    });
  }
}

フローティングウィンドウの実装

フローティングウィンドウは、他のアプリの上に重ねて表示される小型ウィンドウです。通知やクイック操作に適しています。

import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';

export default class FloatWindowAbility extends UIAbility {
  onWindowStageCreate(windowStage) {
    const config = {
      name: 'quickNote',
      windowType: window.WindowType.TYPE_FLOAT,
      ctx: this.context
    };

    window.createWindow(config, (err, floatWin) => {
      if (err) {
        console.error('Floating window creation failed:', JSON.stringify(err));
        return;
      }

      floatWin.moveWindowTo(100, 100, () => {});
      floatWin.resize(350, 250, () => {});

      floatWin.setUIContent('pages/QuickNote', (loadErr) => {
        if (!loadErr) {
          floatWin.showWindow((showErr) => {
            if (!showErr) {
              console.info('Floating window displayed.');

              // 使用後は明示的に破棄(例として即時破棄)
              setTimeout(() => {
                floatWin.destroyWindow((destroyErr) => {
                  if (!destroyErr) console.info('Floating window destroyed.');
                });
              }, 10000);
            }
          });
        }
      });
    });
  }
}

タグ: HarmonyOS ArkTS Window Management Immersive Mode Floating Window

8月29日 17:49 投稿