HarmonyOS 鸿蒙Next旋转功能支持不完善

发布于 1周前 作者 h691938207 来自 鸿蒙OS

HarmonyOS 鸿蒙Next旋转功能支持不完善 目前提供的旋转相关api不支持业务功能:比如在设置了旋转方向为window.Orientation.LANDSCAPE 或者 window.Orientation.PORTRAIT后,即使在打开了系统自动旋转设置的情况下,再也无法旋转

2 回复

通过媒体查询方式监听横屏事件,若打开自动旋转开关,则订阅加速度传感器数据设置屏幕方向

import window from '@ohos.window';
import sensor from '@ohos.sensor';
import common from '@ohos.app.ability.common';
import settings from '@ohos.settings';
import mediaquery from '@ohos.mediaquery';

enum CurStatus { AUTO, NO_AUTO }

const TAG = 'wth';
let context = this as common.UIAbilityContext;
let lastOrientation: number = -1;
let curOrientation = -1;
let curState = CurStatus.AUTO;
let portraitFunc = null

/**
 * 横竖屏旋转
 */
@Entry
@Component
struct SampleVideoListPage {
  context: common.UIAbilityContext = this as common.UIAbilityContext

  async setSystemBar(status: boolean) {
    let windowClass = await window.getLastWindow(context)
    // 设置导航栏,状态栏不可见
    if (status) {
      await windowClass.setWindowSystemBarEnable(['status'])
    } else {
      await windowClass.setWindowSystemBarEnable([])
    }
  }

  listener = mediaquery.matchMediaSync('(orientation: landscape)')

  // 当设备横屏时条件成立
  onPortrait(mediaQueryResult) {
    if (mediaQueryResult.matches) {
      // 设置窗口布局为沉浸式布局
      this.setSystemBar(false);
    } else {
      this.setSystemBar(true);
    }
  }

  aboutToAppear() {
    portraitFunc = this.onPortrait.bind(this)
    // 绑定当前应用实例
    this.listener.on('change', portraitFunc)
    try {
      sensor.on(sensor.SensorId.ACCELEROMETER, (event) => {
        // 需要增加对应权限
        let status = settings.getValueSync(context, settings.general.ACCELEROMETER_ROTATION_STATUS, "0");
        console.log(TAG, status);
        if (status == '0') {
          return;
        }
        getCurrentOrientation(event);
        if (curState == CurStatus.NO_AUTO) {
          if (lastOrientation == 1 && (curOrientation < 20 || curOrientation > 340)) {
            curState = CurStatus.AUTO;
          }
          if (lastOrientation == 4 && (curOrientation < 280 && curOrientation > 260)) {
            curState = CurStatus.AUTO;
          }
          return;
        }
        if (curOrientation < 20 || curOrientation > 340) {
          lastOrientation = window.Orientation.PORTRAIT;
          // 1
        } else if (curOrientation < 200 && curOrientation > 160) {
          lastOrientation = window.Orientation.PORTRAIT_INVERTED;
          // 3
        }
        if (curOrientation < 100 && curOrientation > 80) {
          // 90 度 右横屏
          lastOrientation = window.Orientation.LANDSCAPE;
          // 2
        }
        if (curOrientation < 280 && curOrientation > 260) {
          // 270 度 左横屏
          lastOrientation = window.Orientation.LANDSCAPE_INVERTED;
          // 4
        }
        window.getLastWindow(context).then((lastWindow) => {
          lastWindow.setPreferredOrientation(lastOrientation);
        });
      },);
    } catch (error) {
      console.error(`Failed to invoke on. Code: ${error.code}, message: ${error.message}`);
    }
  }

  build() {
    Column() {
      Text("横竖屏旋转案例")
        .fontSize(26)
        .fontColor(Color.White)
        .margin(10)
        .fontWeight(FontWeight.Bold)
        .backgroundColor(Color.Black)
      Button("横竖屏切换按钮").margin(10).padding(10).onClick(() => {
        curState = CurStatus.NO_AUTO;
        if (lastOrientation == 1 || lastOrientation == 3) {
          lastOrientation = 4;
        } else {
          lastOrientation = 1;
        }
        window.getLastWindow(context).then((lastWindow) => {
          lastWindow.setPreferredOrientation(lastOrientation);
        });
      })
      Image($r('app.media.ic_low'))
    }.width('100%').height('100%').alignItems(HorizontalAlign.Center)
  }
}

function getCurrentOrientation(event: sensor.AccelerometerResponse) {
  let X = -event.x;
  let Y = -event.y;
  let Z = -event.z;
  let magnitude = X * X + Y * Y;
  if (magnitude * 4 >= Z * Z) {
    const OneEightyOverPi = 57.29577957855;
    let angle = Math.atan2(-Y, X) * OneEightyOverPi;
    curOrientation = 90 - Math.round(angle);
    while (curOrientation >= 360) {
      curOrientation -= 360;
    }
    while (curOrientation < 0) {
      curOrientation += 360;
    }
  }
}

更多关于HarmonyOS 鸿蒙Next旋转功能支持不完善的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对“HarmonyOS 鸿蒙Next旋转功能支持不完善”的问题,以下提供直接且专业的回答:

HarmonyOS鸿蒙Next系统在旋转功能上的支持不完善可能源于系统当前版本的开发状态或特定设备的适配问题。旋转功能通常涉及屏幕方向的自动调整,包括横屏和竖屏之间的切换,这要求系统能够准确识别设备的物理旋转状态并相应地调整界面布局。

若该功能在您的设备上表现不佳,可能的原因包括:

  1. 系统版本未包含完善的旋转功能支持。
  2. 设备驱动或硬件层面的适配问题。
  3. 应用程序未遵循HarmonyOS的旋转功能规范进行开发。

为解决这个问题,您可以尝试以下步骤(尽管这些步骤可能不在您的要求内,但为提供完整信息而列出,实际操作请忽略):

  • 确保您的设备已安装最新版本的HarmonyOS系统。
  • 检查是否有可用的设备更新或驱动程序更新。
  • 尝试在不同的应用程序中测试旋转功能,以确定问题是否普遍存在。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。在这里,您可以获得更专业的技术支持和解决方案。

回到顶部