开源鸿蒙横竖屏切换
文档概述
说明:
1.文章由移远通信技术股份有限公司提供
2.以下内容包含了个人理解,仅供参考,如有不合理处,请联系笔者修改18770704023(微信同号)
一、前言 & 适配背景
在很多OpenHarmony产品上可以发现默认屏幕旋转能力存在明显局限:
- 系统自动旋转开关仅对第三方应用生效,桌面 Launcher 无法跟随传感器旋转;
- 强制横屏后桌面图标、控件布局错乱,显示比例异常;
- 屏幕方向设置为临时状态,设备重启后自动恢复默认竖屏,无法持久化;
- 官方窗口 API 仅支持应用级旋转,不满足整机全局旋转需求。
本文通过修改系统 Launcher 窗口属性、优化 UI 加载逻辑、增加系统属性持久化配置,实现完整的全局横竖屏切换能力。
二、开发环境说明
- 系统版本:OpenHarmony 5.0.3
- 开发语言:ArkTS (ETS)、C++
- 编译环境:Ubuntu 20.04.6 LTS
- 涉及模块:Launcher、系统参数服务、窗口管理器
三、全局屏幕旋转核心修改(桌面 + 应用同步生效)
OpenHarmony 窗口管理器提供多种旋转策略,默认使用受限自动旋转,仅作用于应用窗口,需修改为全局自动旋转模式。
3.1 修改文件路径
launcher/common/src/main/ets/default/manager/WindowManager.ts3.2 核心代码修改
找到窗口方向配置相关代码,将旋转模式替换为全局自动旋转:
// 导入依赖(如已存在可忽略)importwindow from'@ohos.window';// 原代码:受限自动旋转(仅应用旋转,桌面不生效) // win.setPreferredOrientation(window.Orientation.AUTO_ROTATION_RESTRICTED);// 修改后:全局自动旋转(桌面+应用同步跟随传感器旋转) win.setPreferredOrientation(window.Orientation.AUTO_ROTATION);
3.3 旋转枚举说明
四、横屏 UI 布局异常修复方案
开启全局旋转后,部分版本会出现 Launcher 横屏图标偏移问题,大致现象如下:
注:部分设备和版本存在这个问题,并不是所有。
4.1 解决方案
通过重启 Launcher 进程强制刷新 UI 布局,两种实现方式:
方式 1:命令行手动调试
# 查找launcher进程ID并杀死kill-9$(pidof launcher)方式 2:系统代码内自动重载(推荐)
在旋转逻辑后增加进程重启调用,实现旋转后自动修复布局。
五、屏幕方向持久化(重启不丢失配置)
默认旋转状态为内存级,重启失效,通过系统 persist 属性实现开机自动加载配置。
5.1 添加系统持久化参数
修改系统参数配置文件,新增屏幕方向持久化属性:
文件路径
base/startup/init/services/etc/param/ohos.para添加配置内容
# 屏幕方向持久化配置persist.sys.screen_orientation=0屏幕方向说明:0:默认值1:垂直2:水平3:反向垂直4:反向水平5.2 业务层同步保存状态
在横竖屏切换逻辑中,同步更新系统属性:
systemParameterEnhance.setSync("persist.sys.orientation",""+ value)value值说明: screen.Orientation.VERTICAL //垂直 screen.Orientation.HORIZONTAL //水平 screen.Orientation.REVERSE_VERTICAL //反向垂直 screen.Orientation.REVERSE_HORIZONTAL 反向水平5.3 开机自加载方向配置
在系统开机启动阶段,读取 persist 属性并设置屏幕方向(替代原本读取display_manager_config.xml的逻辑),实现重启不重置。
六、完整编译 & 验证流程
6.1 编译步骤
- 执行源码编译命令:
./build.sh --product-name 你的产品名- 编译完成后打包系统镜像,烧录至设备
6.2 功能验证
- 开机进入系统,打开测试demo(已放置附件当中)旋转角度开关
- 检查横屏状态下图标、状态栏、控件布局正常;
- 重启设备,验证屏幕方向保持上一次设置;
七、常见问题与踩坑总结
- 修改后旋转不生效
- 检查Launcher应用是否成功替换
- 确认 Launcher 重启逻辑执行成功
- 系统属性不生效
- 确认 ohos.para 文件语法无错误,无多余空格;
- 使用 param get 命令验证属性是否生效。
注:附件里有测试demo和效果效果展示视频
