首页 > 其他分享 >HarmonyOS开发之横竖屏旋转适配

HarmonyOS开发之横竖屏旋转适配

时间:2024-09-24 16:27:21浏览次数:11  
标签:degree settings 适配 横竖 旋转 HarmonyOS window 方向 页面

场景描述

在HarmonyOS移动应用开发中,横竖屏旋转适配成为了一个不可或缺的功能点。特别是在HarmonyOS NEXT平台,开发者面临着更加多样化的设备和更复杂的用户交互需求。以下是我们在项目中遇到的一些关于横竖屏旋转的高频问题及解决方案:

  1. 如何通过传感器自己感知方向并设置旋转:在不考虑设备是否启用了系统自带的旋转锁定的情况下,如何利用传感器来检测设备方向,并据此调整应用的显示方向。
  2. 同一应用内不同页面的不同旋转策略:例如,首页只支持竖屏显示,而详情页则支持横竖屏自由切换。
概念说明
  • 旋转策略:指当前页面支持的设备旋转方向。
  • 页面方向:指手机页面当前的显示方向。

场景一:通过传感器感知方向并设置旋转

关键步骤
  1. 感知方向:使用sensor模块中的重力传感器(GRAVITY)来获取设备的真实朝向。
import sensor from '@ohos.sensor';

// 注册重力传感器事件
sensor.on(sensor.SensorId.GRAVITY, (data: sensor.GravityResponse) => {
  let degree: number = -1;
  let rotation: string = 'INVALID';
  
  // 计算角度
  function CalDegree(x: number, y: number, z: number): number {
    return Math.round(Math.atan2(y, x) * (180 / Math.PI));
  }
  
  degree = CalDegree(data.x, data.y, data.z);
  
  // 根据角度确定旋转方向
  if (degree >= 0 && (degree <= 30 || degree >= 330)) {
    rotation = "ROTATION_0";
  } else if (degree >= 60 && degree <= 120) {
    rotation = "ROTATION_90";
  } else if (degree >= 150 && degree <= 210) {
    rotation = "ROTATION_180";
  } else if (degree >= 240 && degree <= 300) {
    rotation = "ROTATION_270";
  }
  
  // 设置窗口的显示方向
  if (rotation !== 'INVALID') {
    window(getContext(this)).then((win) => {
      win.setPreferredOrientation(rotation);
    });
  }
});
  1. 设置旋转:通过window模块提供的setPreferredOrientation方法来设置窗口的显示方向。

HarmonyOS开发之横竖屏旋转适配_横竖屏切换

场景二:同一应用内不同页面的不同旋转策略

关键步骤
  1. 注册无感监听:在应用启动时,注册一个全局监听器来监听页面的生命周期变化。
  2. 建立页面与旋转方向的映射表:定义一个映射表,用于存储每个页面对应的旋转方向。
const pageOrientations: Record<string, window.Orientation> = {
  "Logon": window.Orientation.PORTRAIT,
  "Detail": window.Orientation.LANDSCAPE,
  "Page2": window.Orientation.PORTRAIT_INVERTED,
  "Page3": window.Orientation.LANDSCAPE_INVERTED,
};
  1. 控制旋转策略:当页面发生变化时,根据映射表来调整页面的旋转方向。
import window from '@ohos.window';

// 监听页面生命周期变化
function trackPageLifecycle(windowName: string, lifecycleEvent: any) {
  const win = window.getLastWindow(getContext(this));
  const pageName = lifecycleEvent.name; // 假设此为页面名称
  
  // 根据页面名称设置旋转方向
  win.setPreferredOrientation(pageOrientations[pageName]);
}

// 初始化监听
function initPageTracking() {
  const observer = window.createWindowObserver();
  observer.on('pageShow', (info) => trackPageLifecycle(info.windowName, info));
  observer.on('pageHide', (info) => trackPageLifecycle(info.windowName, info));
}

initPageTracking();

场景三:视频播放过程中的临时方向设置

对于视频播放等特定场景,可能需要提供一种临时改变屏幕方向的方式,而不会影响整体的应用旋转策略。

window.getLastWindow(getContext(this), (err, win) => {
  if (err) {
    console.error("Failed to get last window", err);
    return;
  }
  win.setPreferredOrientation(window.Orientation.USER_ROTATION_LANDSCAPE);
});

其他常见问题

Q: 如何感知系统的自动旋转开关状态?

A: 可以通过sensor模块监听设备方向的变化,同时使用settings模块查询系统的自动旋转开关状态。

import settings from '@ohos.settings';

// 查询自动旋转开关状态
const isAutoRotationEnabled = settings.getValueSync(getContext(), settings.general.ACCELEROMETER_ROTATION_STATUS, '-1') === '1';
console.log("Auto Rotation is " + (isAutoRotationEnabled ? "enabled" : "disabled"));

// 获取当前设备的方向
const currentOrientation = settings.getValueSync(getContext(), settings.display.DEFAULT_SCREEN_ROTATION, '-1');
console.log("Current screen rotation: " + currentOrientation);


标签:degree,settings,适配,横竖,旋转,HarmonyOS,window,方向,页面
From: https://blog.51cto.com/u_15171169/12100784

相关文章

  • 适配器模式详解:解决接口不兼容的利器
    适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式主要用于解决“接口不兼容”问题。一,适配器模式的结构适配器模式主要包含以下几个部分:目标接口(Target):客户期望的接口。......
  • 设计模式之适配器模式
    适配器模式适配器模式(AdapterPattern)是一种结构型设计模式,它允许不兼容的接口之间进行交互。在软件工程中,适配器用于解决两个已有接口之间不匹配的问题,使得原本因接口不兼容而不能一起工作的类可以协同工作。基本概念目标接口(Target):客户期望使用的接口,它定义了客户需要的方法......
  • c#代码介绍23种设计模式_07适配器模式
    目录1、适配器模式2、类的适配器模式实现(ClassAdapterPattern.cs)3、对象的适配器模式实现(ObjectAdapterPattern.cs)4、适配器模式的优缺点4-1.类的适配器模式:4-2.对象的适配器模式5、使用场景6、.NET中适配器模式的实现7、实现思路1、适配器模式在实际的开发......
  • css使用@media响应式适配各种屏幕的方法示例
    定义和使用使用@media查询,你可以针对不同的媒体类型定义不同的样式。@media可以针对不同的屏幕尺寸设置不同的样式,特别是如果你需要设置设计响应式的页面,@media是非常有用的。当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面。PC端设备屏幕的宽度......
  • 华为HarmonyOS地图服务 11 - 如何在地图上增加点注释?
    场景介绍本章节将向您介绍如何在地图的指定位置添加点注释以标识位置、商家、建筑等,并可以通过信息窗口展示详细信息。点注释支持功能:支持设置图标、文字、碰撞规则等。支持添加点击事件。PointAnnotation有默认风格,同时也支持自定义。由于内容丰富,以下只展示一些基础功能......
  • 英特尔®以太网网络适配器E810-CQDA1 / E810-CQDA2 网卡 规格书 e810 网卡 规格书 Int
    英特尔®以太网800系列网络适配器英特尔®以太网网络适配器E810-CQDA1/CQDA2在10到100Gbps的以太网速度下实现高效的工作负载优化性能关键特性•单、双端口QSFP28•应用设备队列(ADQ)•PCIExpress(PCIe)4.0x16•动态设备个性化(DDP)•以太网端口配置工具(EPCT)......
  • HarmonyOS与OpenHarmony的区别
    HarmonyOS所有权:HarmonyOS是由华为公司开发的操作系统。目标市场:HarmonyOS主要面向中国市场及其用户,用于华为的智能手机、平板电脑、智能手表、电视等多种智能设备。兼容性:HarmonyOS在早期版本中支持运行Android应用,但随着时间的发展,它逐渐转向了自己的应用生态系统。专......
  • MBR60100PT-ASEMI适配变频器专用MBR60100PT
    编辑:llMBR60100PT-ASEMI适配变频器专用MBR60100PT型号:MBR60100PT品牌:ASEMI封装:TO-247安装方式:插件批号:最新最大平均正向电流(IF):60A最大循环峰值反向电压(VRRM):100V最大正向电压(VF):0.70V~0..90V工作温度:-65°C~175°C反向恢复时间:35ns芯片个数:2芯片尺寸:74mil引脚数量:3正向浪涌电流(IFMS):35......
  • MBR60100PT-ASEMI适配变频器专用MBR60100PT
    编辑:llMBR60100PT-ASEMI适配变频器专用MBR60100PT型号:MBR60100PT品牌:ASEMI封装:TO-247安装方式:插件批号:最新最大平均正向电流(IF):60A最大循环峰值反向电压(VRRM):100V最大正向电压(VF):0.70V~0..90V工作温度:-65°C~175°C反向恢复时间:35ns芯片个数:2芯片尺寸:74mil引脚数量:3正......
  • 为什么MDB-RS232支付适配器一上电,串口会一直收到通信数据,而且MDB转换盒上的PC指示灯一
    MDB-RS232支付通信适配器通电后,RS232端口就会不停地收到数据,而且MDB适配器上的“PC”指示灯也一直在闪烁。MDB协议里有的数据,是报告一次。有的数据是持续报告。比如设备在线状态,硬币器如果不在线,是不是在线,只能靠读取。而纸币器是会一直主动报告这个状态数据。而且如果不使能......