HarmonyOS Next全屏播放视频时如何实现锁定屏幕不旋转功能?

部分视频应用支持屏幕锁定功能,在全屏状态下,实现对功能按钮的隐藏,并临时锁定屏幕的旋转,避免用户误触其他操作按钮。屏幕锁定后,应用可以在横屏和反向横屏之间翻转,不可由横屏旋转为竖屏,解锁后,如果当前屏幕处于竖屏,则应该恢复到竖屏显示。
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

阅读 775
avatarAI BotBETA
在 HarmonyOS Next 中实现全屏播放视频时锁定屏幕不旋转功能,可以通过以下步骤进行:

1. **获取 WindowManager 实例**:
   首先,需要获取当前窗口的 `WindowManager` 实例,以便控制窗口的属性。

2. **设置屏幕方向**:
   在全屏播放视频时,设置屏幕方向为横屏或反向横屏。这可以通过修改 `WindowManager.LayoutParams` 的 `screenOrientation` 属性来实现。

3. **禁用屏幕旋转**:
   为了避免用户误触导致屏幕旋转,可以临时禁用系统的屏幕旋转功能。这通常涉及修改系统设置或使用特定的 API 来锁定屏幕方向。

4. **自定义全屏控制逻辑**:
   实现功能按钮的隐藏,并添加逻辑来处理屏幕锁定和解锁。在锁定时,只允许横屏和反向横屏之间的翻转;在解锁后,如果当前屏幕处于竖屏,则恢复到竖屏显示。

5. **监听屏幕方向变化**:
   使用传感器或系统回调来监听屏幕方向的变化,并根据当前状态调整应用的行为。

6. **恢复屏幕旋转**:
   在退出全屏播放或用户手动解锁屏幕旋转时,恢复系统的屏幕旋转功能。

请注意,具体的实现细节可能因 HarmonyOS 的版本和 API 差异而有所不同。建议查阅最新的 HarmonyOS 开发文档或相关开发者社区以获取更详细的指南和示例代码。
1 个回答

部分视频应用支持屏幕锁定功能,在全屏状态下,实现对功能按钮的隐藏,并临时锁定屏幕的旋转,避免用户误触其他操作按钮。屏幕锁定后,应用可以在横屏和反向横屏之间翻转,不可由横屏旋转为竖屏,解锁后,如果当前屏幕处于竖屏,则应该恢复到竖屏显示。

答案:
针对上述功能可以考虑如下实现:
1、判断当前控制中心的开关状态,如果是已经锁定情况下,则不需要进行额外处理
2、锁定时设置旋转策略为AUTO_ROTATION_LANDSCAPE,即支持横屏和反向横屏旋转,不受控制中心控制
3、解锁时需要回到支持三向旋转,即支持横屏、竖屏、反向横屏,并受到控制中心控制

可以由上述推断功能实现得到如下代码:

Image(this.isVideoLock ? $r('app.media.icon_lock') : $r('app.media.icon_lock_open'))
  // ...
  .onClick(() => {
    this.isVideoLock = !this.isVideoLock;
    // ...
    if (this.isVideoLock) {
      this.setOrientation(window.Orientation.AUTO_ROTATION_LANDSCAPE);
    } else {
      this.setOrientation(window.Orientation.AUTO_ROTATION_UNSPECIFIED);
    }
  })

对于需要在折叠屏状态下对旋转逻辑进行单独处理的情况,可以封装如下方法isExpandedOrHalfFolded方法,来判断当前设备是否为折叠屏展开态,处于折叠屏展开态情况下,不会触发旋转逻辑。

isExpandedOrHalfFolded(): boolean {
  return display.getFoldStatus() === display.FoldStatus.FOLD_STATUS_EXPANDED ||
    display.getFoldStatus() == display.FoldStatus.FOLD_STATUS_HALF_FOLDED
}

当要对设备控制中心状态进行监听时,可以通过setting.registerKeyObserver,监听控制中心变化,其中orientationLockState是当前设备控制中心的状态,当设备控制中心的状态为“0”时,即代表旋转功能被系统锁定,此时在处理锁定功能代码中不需要进行旋转逻辑的处理,因为在控制中心旋转开关关闭的情况下,屏幕的旋转行为会收到限制,所以首先要考虑对控制中心的旋转锁定状态进行判断,可以参考如下代码实现对设备控制中心的状态监听:

settings.registerKeyObserver(context, settings.general.ACCELEROMETER_ROTATION_STATUS,
  settings.domainName.DEVICE_SHARED, () => {
    this.orientationLockState =
      settings.getValueSync(getContext(this), settings.general.ACCELEROMETER_ROTATION_STATUS,
        settings.domainName.DEVICE_SHARED);
  });

排除了当前设备后,即可以进行通过应用内锁定按钮进行逻辑判断,锁定状态下,调用setOrientation设置为Landscape,此时可以在横屏和反向横屏旋转,解锁后,恢复到三向(横屏、竖屏、反向横屏)旋转策略:

if (this.isVideoLock) {
  this.setOrientation(window.Orientation.AUTO_ROTATION_LANDSCAPE);
} else {
  this.setOrientation(window.Orientation.AUTO_ROTATION_UNSPECIFIED);
}

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题