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开发板上的效果):

相关推荐
Hstar_chen7 分钟前
开源一款 HarmonyOS 服务器监控客户端:星辰云巡 1.0.3
服务器·华为·harmonyos
2501_919749037 小时前
华为鸿蒙免费视频播放器APP—小羊免费播放器
华为·harmonyos·鸿蒙
2501_919749038 小时前
华为鸿蒙免费背书背课文背稿子APP—小羊背诵
华为·harmonyos·鸿蒙
OH_TPC9 小时前
HarmonyOS APP开发---"随手画"白板涂鸦App,需要用到这个库
harmonyos
lilian23310 小时前
HarmonyOS 7 新特性(二十六)|LazyLayoutAlgorithm 自定义懒布局
华为·harmonyos
lilian23311 小时前
HarmonyOS 7 新特性(二十九)|游戏伴随服务:悬浮协作与质量降级
游戏·语音识别·harmonyos
王二蛋与他的张大花11 小时前
让小艺替我回答“还有多久下班“——摸鱼鸭的 HarmonyOS 7 Skill 接入实战
harmonyos
用户09340777351412 小时前
HarmonyOS WPS Open SDK 实践:把水印与修订收成打开策略层
android·typescript·harmonyos
Veer Han14 小时前
DevEco CLI 实战:鸿蒙 App「宝贝日程表」从 0 开发到正式上架
华为·harmonyos
李游Leo14 小时前
【共创稿事节】 HarmonyOS 7 空间化 UI 实战:从平面布局到空间层级的界面重构
ui·平面·harmonyos