HarmonyOS Next 实现横竖屏旋转及页面布局切换

1 效果简述

在播放视频软件中,会有点击按钮后竖屏播放切换为横屏播放的功能,过程中附带应用旋转的效果。本文以demo形式展示HarmonyOS Next的实现。

2 实现原理

实现的基本步骤为,在点击按钮后,通过窗口的setPreferredOrientation接口设置应用窗口windoworientation为横屏,此时系统侧会更改窗口宽高,这时只需要监听窗口的windowSizeChange事件,在回调中更改页面布局即可。

其中orientation的枚举值为:

开发过程中,需要横屏时,将window的orientation设置为LANDSCAPE_INVERTED,竖屏时设为PORTRAIT。

3 代码实现

由于需要操作应用的窗口属性,因此需要首先获取应用的window对象:

3.1 获取应用的窗口window对象

需要在EntryAbility.ets中的onWindowStageCreate生命周期中,保存窗口对象以备后续使用:

修改内容为下述代码的第6-7行:

ts 复制代码
onWindowStageCreate(windowStage: window.WindowStage): void {
  // Main window is created, set main page for this ability
  hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

  // 先通过getMainwWindowSync获取window,再保存到数据结构中
  let window = windowStage.getMainWindowSync();
  MyWindowUtil.setWindow(window);

  windowStage.loadContent('pages/Index', (err, data) => {

对应的MyWindowUtil类型定义为:

ts 复制代码
import window from '@ohos.window'

export class MyWindowUtil {
  private static window: window.Window;

  public static setWindow(window: window.Window): void {
    this.window = window;
  }

  public static getWindow(): window.Window {
    return this.window;
  }
}

3.2 在界面中添加触发旋转屏逻辑并监听windowSizeChange尺寸变化

ts 复制代码
import window from '@ohos.window';
import { BusinessError } from '@ohos.base';
import { MyWindowUtil } from '../common/MyWindowUtil';

@Entry
@Component
struct Index {
  @State widthValue: number = 200;
  @State heightValue: number = 100;

  private isLandScape: boolean = false;

  aboutToAppear(): void {
    // aboutToAppear中监听窗口尺寸变化,在回调中改变页面内容的布局以适配横屏
    try {
      MyWindowUtil.getWindow().on('windowSizeChange', (data) => {
        if (data.width > data.height) {
          this.widthValue = 300;
          this.heightValue = 200;
        } else {
          this.widthValue = 200;
          this.heightValue = 100;
        }
      })
    } catch (exception) {
      console.log('register windowSizeChange failed ' + JSON.stringify(exception));
    }
  }

  build() {
    Stack() {
      Image($r('app.media.spring'))
        .size({ width: this.widthValue, height: this.heightValue })
    }
    .size({ width: '100%', height: '100%' })
    .onClick(() => {
      let orientation = this.isLandScape ? window.Orientation.PORTRAIT : window.Orientation.LANDSCAPE_INVERTED;
      this.isLandScape = !this.isLandScape;
      try {
        // 点击界面,设置窗口的orientation
        MyWindowUtil.getWindow().setPreferredOrientation(orientation, (err: BusinessError) => {
          console.info('onClick, businessError ' + JSON.stringify(err));
        })
      } catch (exception) {
        console.info('onClick, exception ' + JSON.stringify(exception));
      }
    })
  }
}

效果(在RK3568开发板上的效果):

相关推荐
HarmonyOS_SDK11 分钟前
探索自定义地图样式,打造应用专属个性化地图
harmonyos
IT小码哥丶23 分钟前
HarmonyOS实战:自定义时间选择器
android·harmonyos
__Benco6 小时前
OpenHarmony外设驱动使用 (四),Face_auth
人工智能·驱动开发·计算机视觉·harmonyos
bestadc6 小时前
鸿蒙 系统-安全-程序访问控制-应用权限管控
harmonyos
IT小码哥丶7 小时前
HarmonyOS实战:快速实现一个上下滚动的广告控件
华为·harmonyos
幽蓝计划9 小时前
Uniapp开发鸿蒙应用时如何运行和调试项目
华为·uni-app·harmonyos
魔术师ID16 小时前
HarmonyOS开发组件基础
华为·harmonyos
周胡杰20 小时前
组件导航 (Navigation)+flutter项目搭建-混合开发+分栏
数码相机·flutter·华为·电脑·harmonyos·鸿蒙
特立独行的猫a1 天前
HarmonyOS 影视应用APP开发--配套的后台服务go-imovie项目介绍及使用
华为·golang·harmonyos·影视app
梁下轻语的秋缘1 天前
HarmonyOS:重构万物互联时代的操作系统范式
华为·重构·harmonyos