【HarmonyOS】ArkTS开发应用的横竖屏切换
文章目录
- 1、简介
- 2、静态 — 横竖屏切换
- 2.1、效果
- 2.2、实现原理
- 2.3、module.json5 源码
- 3、动态 — 横竖屏切换
- 3.1、应用随系统旋转切换横竖屏
- 3.2、setPreferredOrientation 原理配置
- 3.3、锁定旋转的情况下,手动设置横屏状态
1、简介
在完成全屏网页嵌套应用开发后,设备方向适配成为提升用户体验的关键环节。本文将深度解析鸿蒙ArkTS框架下静态配置与动态调整两种横竖屏切换方案,结合实际开发场景提供可复用的技术实现。
随着移动端场景多元化,应用需适配手持阅读、平板展示等多形态需求。鸿蒙系统提供双模式支持:
- 静态配置:通过模块声明实现基础方向锁定
- 动态调整:运行时感知设备旋转并智能适配
2、静态 — 横竖屏切换
2.1、效果
可通过修改module.json5中abilities下orientation属性实现横竖屏切换。
2.2、实现原理
标识当前UIAbility组件启动时的方向,支持配置枚举和启动方向资源索引。枚举支持的取值如下:
-
unspecified:未指定方向,由系统自动判断显示方向。
-
landscape:横屏。
-
portrait:竖屏。
-
follow_recent:跟随背景窗口的旋转模式。
-
landscape_inverted:反向横屏。
-
portrait_inverted:反向竖屏。
-
auto_rotation:随传感器旋转。
-
auto_rotation_landscape:传感器横屏旋转,包括横屏和反向横屏。
-
auto_rotation_portrait:传感器竖屏旋转,包括竖屏和反向竖屏。
-
auto_rotation_restricted:传感器开关打开,方向可随传感器旋转。
-
auto_rotation_landscape_restricted:传感器开关打开,方向可随传感器旋转为横屏, 包括横屏和反向横屏。
-
auto_rotation_portrait_restricted:传感器开关打开,方向随可传感器旋转为竖屏, 包括竖屏和反向竖屏。
-
locked:传感器开关关闭,方向锁定。
-
auto_rotation_unspecified:受开关控制和由系统判定的自动旋转模式。
-
follow_desktop:跟随桌面的旋转模式。
配置启动方向的资源索引时,取值为长度不超过255字节的字符串。
启动方向资源索引配置示例:$string:orientation。
2.3、module.json5 源码
按照上述原理,假设我们要直接设置横屏,module.json5 代码如下:
{"module": {"name": "entry","type": "entry","description": "$string:module_desc","mainElement": "EntryAbility","deviceTypes": ["phone"],"deliveryWithInstall": true,"installationFree": false,"pages": "$profile:main_pages","abilities": [{"name": "EntryAbility","srcEntry": "./ets/entryability/EntryAbility.ts","description": "$string:EntryAbility_desc","icon": "$media:icon","label": "$string:EntryAbility_label","orientation": "landscape","startWindowIcon": "$media:icon","startWindowBackground": "$color:start_window_background","exported": true,"skills": [{"entities": ["entity.system.home"],"actions": ["action.system.home"]}]}],}
}
3、动态 — 横竖屏切换
3.1、应用随系统旋转切换横竖屏
应用的页面都会随着手机旋转而发生展示上的切换,而打开时则不会发生旋转行为,此时就需要配置为auto_rotation_restricted。
3.2、setPreferredOrientation 原理配置
在具体需要实现横竖屏切换的页面上,例如视频播放页面支持横屏,但是首页的内容是支持仅竖屏的,那么就需要在进入对应的页面时,采用window窗口提供的设置窗口方向的能力,通过setPreferredOrientation将窗口显示的方向修改为横屏、竖屏的状态。在使用时,需根据应用自身的旋转策略选择相应的参数,可以封装如下方法,进行旋转策略的设置。
具体如下:通过getContext拿到对应的UIAbilityContext,并通过context拿到对应的windowStage实例,然后通过windowStage.getMainWindowSync同步方法拿到对应的窗口实例win,然后调用setPreferredOrientation方法设置窗口方向。
setOrientation(orientation: number) {this.windowClass.setPreferredOrientation(orientation).then(() => {console.info('setWindowOrientation: ' + orientation + ' Succeeded.');}).catch((err: BusinessError) => {console.info('setWindowOrientation: ' + orientation + ' Failed. Cause: ' + JSON.stringify(err));});
}
3.3、锁定旋转的情况下,手动设置横屏状态
以视频播放为例,不仅需要可以通过系统控制横竖屏,也支持用户在系统锁定旋转的情况下,手动设置横屏状态,即需要满足以下条件:
1、应用跟随传感器旋转。
2、受到控制中心的旋转锁定按钮控制。
3、支持用户使用应用时,在页面中临时调用设置方向能力,如点击全屏按钮进行切换。
要实现以上效果,可以使用窗口的能力设置orientation的枚举类型进行相应的旋转,由于要提供临时设置方向的能力,用户在手动点击全屏按钮时,相当于需要手动触发横竖屏切换,如果此时关闭了旋转锁定,那么窗口需要能够跟随传感器一起发生旋转,所以可以使用以下枚举中的能力,临时调用旋转,并让其后续也能支持跟随传感器。
orientation枚举值 | 枚举数值 | 效果描述 |
---|---|---|
USER_ROTATION_PORTRAIT | 13 | 调用时临时旋转到竖屏,之后跟随传感器自动旋转,受控制中心的旋转开关控制,且可旋转方向受系统判定。 |
USER_ROTATION_LANDSCAPE | 14 | 调用时临时旋转到横屏,之后跟随传感器自动旋转,受控制中心的旋转开关控制,且可旋转方向受系统判定。 |
分析旋转方向:对于视频播放的应用,一般旋转方向不会旋转到反向竖屏(由UX需求决定),即只旋转到竖屏、横屏和反向横屏。并且用户在使用时,点击切换按钮时,根据用户习惯,一般默认是旋转到横屏状态,然后支持跟随传感器旋转到反向横屏。
在需要用户点击的地方,需要根据进入全屏和退出全屏分别执行相应的逻辑,需要使用的方向状态如下:
设置为横屏时,对应窗口方向为横屏状态:this.setOrientation(window.Orientation.USER_ROTATION_LANDSCAPE),例如进入播放页时,进行竖屏 -> 横屏切换;
Image($r('app.media.icon_zoom_in'))// ....onClick(() => {if (display.getFoldStatus() === display.FoldStatus.FOLD_STATUS_EXPANDED || display.getFoldStatus() === display.FoldStatus.FOLD_STATUS_HALF_FOLDED) {this.isLandscape = true;} else {this.setOrientation(window.Orientation.USER_ROTATION_LANDSCAPE);}})
设置为竖屏时,对应窗口方向为竖屏状态:this.setOrientation(window.Orientation.USER_ROTATION_PORTRAIT),例如在返回竖屏状态时,进行横屏 -> 竖屏切换;
Image($r('app.media.icon_back'))// ....onClick(() => {// ...this.setOrientation(window.Orientation.USER_ROTATION_PORTRAIT);// ...})
注意!
需要注意的是,由于setPreferredOrientation方法调用改变的是窗口的显示方向,所以如果在进入视频播放页时,手动调用了旋转到横屏,那么在退出时也需要手动调用该接口,使窗口回到之前的竖屏状态。
相关文章:
【HarmonyOS】ArkTS开发应用的横竖屏切换
文章目录 1、简介2、静态 — 横竖屏切换2.1、效果2.2、实现原理2.3、module.json5 源码 3、动态 — 横竖屏切换3.1、应用随系统旋转切换横竖屏3.2、setPreferredOrientation 原理配置3.3、锁定旋转的情况下,手动设置横屏状态 1、简介 在完成全屏网页嵌套应用开发后…...
Linux中find命令用法核心要点提炼
大家好,欢迎来到程序视点!我是你们的老朋友.小二! 以下是针对Linux中find命令用法的核心要点提炼: 基础语法结构 find [路径] [选项] [操作]路径:查找目录(.表当前目录,/表根目录)…...
专栏项目框架介绍
项目整体实现框图 如下图所示,是该项目的整体框图,项目的功能概括为:PC端下发数据文件,FPGA板卡接收数据文件,缓存至DDR中,待数据文件发送完毕,循环读取DDR有效写区域数据,将DDR数据…...
WSL 安装 Debian 12 后,Linux 如何安装 vim ?
在 WSL 的 Debian 12 中安装 Vim 非常简单,只需使用 apt 包管理器即可。以下是详细步骤: 1. 更新软件包列表 首先打开终端,确保系统包列表是最新的: sudo apt update2. 安装 Vim 直接通过 apt 安装 Vim: sudo apt …...
【SpringBoot】从零开始全面解析Spring MVC (一)
本篇博客给大家带来的是SpringBoot的知识点, 本篇是SpringBoot入门, 介绍Spring MVC相关知识. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子…...
C++—特殊类设计设计模式
目录 C—特殊类设计&设计模式1.设计模式2.特殊类设计2.1设计一个无法被拷贝的类2.2设计一个只能在堆上创建对象的类2.3设计一个只能在栈上创建对象的类2.4设计一个类,无法被继承2.5设计一个类。这个类只能创建一个对象【单例模式】2.5.1懒汉模式实现2.5.2饿汉模…...
初入OpenCV
OpenCV简介 OpenCV是一个开源的跨平台计算机视觉库,它实现了图像处理和计算机视觉方面的很多通用算法。 应用场景: 目标识别:人脸、车辆、车牌、动物; 自动驾驶;医学影像分析; 视频内容理解分析ÿ…...
霍夫圆变换全面解析(OpenCV)
文章目录 一、霍夫圆变换基础1.1 霍夫圆变换概述1.2 圆的数学表达与参数化 二、霍夫圆变换算法实现2.1 标准霍夫圆变换算法流程2.2 参数空间的表示与优化 三、关键参数解析3.1 OpenCV中的HoughCircles参数3.2 参数调优策略 四、Python与OpenCV实现参考4.1 基本实现代码4.2 改进…...
互联网大厂Java求职面试:优惠券服务架构设计与AI增强实践-4
互联网大厂Java求职面试:优惠券服务架构设计与AI增强实践-4 场景设定 面试官:某互联网大厂技术总监,拥有超过10年大型互联网企业一线技术管理经验,擅长分布式架构、微服务治理、云原生等领域。 候选人:郑薪苦&#…...
项目中会出现的css样式
1.重复渐变边框 思路: 主要是用重复的背景渐变实现的 如图: <div class"card"><div class"container">全面收集中医癌毒临床医案,建立医案共享机制,构建癌毒病机知识图谱,便于医疗人…...
LeetCode[101]对称二叉树
思路: 对称二叉树是左右子树对称,而不是左右子树相等,所以假设一个树只有3个节点,那么判断这个数是否是对称二叉树,肯定是先判断左右两个树,然后再看根节点,这样递归顺序我们就确认了࿰…...
黑马k8s(四)
1.资源管理介绍 本章节主要介绍yaml语法和kubernetes的资源管理方式 2.YAML语言介绍 3.资源管理方式 命令式对象管理 dev下删除了pod,之后发现还有pod,把原来的pod删除了,重新启动了一个 命令式对象配置 声明式对象配置 命令式对象配置&…...
华为ensp实现跨vlan通信
要在网络拓扑中实现主机192.168.1.1、192.168.1.2和192.168.2.1之间的互相通信,需要正确配置交换机(S5700)和路由器(AR3260),以确保不同网段之间的通信(即VLAN间路由)。 网络拓扑分析…...
TCPIP详解 卷1协议 十 用户数据报协议和IP分片
10.1——用户数据报协议和 IP 分片 UDP是一种保留消息边界的简单的面向数据报的传输层协议。它不提供差错纠正、队列管理、重复消除、流量控制和拥塞控制。它提供差错检测,包含我们在传输层中碰到的第一个真实的端到端(end-to-end)校验和。这…...
Java笔记4
第一章 static关键字 2.1 概述 以前我们定义过如下类: public class Student {// 成员变量public String name;public char sex; // 男 女public int age;// 无参数构造方法public Student() {}// 有参数构造方法public Student(String a) {} }我们已经知道面向…...
Matlab 垂向七自由度轨道车辆开关型半主动控制
1、内容简介 Matlab 229-垂向七自由度轨道车辆开关型半主动控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
Matlab 短时交通流预测AR模型
1、内容简介 Matlab 230-短时交通流预测AR模型 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略城市道路短时交通流预测.pdf...
MYSQL之表的约束
表中真正约束字段的是数据类型, 但是只有数据类型约束就很单一, 也需要有一些额外的约束, 从而更好的保证数据的合法性, 从业务逻辑角度保证数据的正确性. 比如有一个字段是email, 要求是唯一的. 为什么要有表的约束? 表的约束: 表中一定要有各种约束, 通过约束, 让我们未来…...
使用ACE-Step在本地生成AI音乐
使用ACE-Step v1-3.5B开源模型从文本提示、标签和歌词创建完整的AI生成歌曲 — 无需云服务,无需API,仅需您的GPU。 这是由ACE Studio和StepFun开发的开源音乐生成模型。 在对数据隐私和云服务依赖性日益增长的担忧时代,ACE-Step将强大的文本转音乐生成完全离线,使其成为A…...
web 自动化之 Unittest 四大组件
文章目录 一、如何开展自动化测试1、项目需求分析,了解业务需求 web 功能纳入自动化测试2、选择何种方式实现自动化测试 二、Unittest 框架三、TestCase 测试用例四、TestFixture 测试夹具 执行测试用例前的前置操作及后置操作五、TestSuite 测试套件 & TestLoa…...
2025年渗透测试面试题总结-渗透测试红队面试七(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 渗透测试红队面试七 一百八十一、Shiro漏洞类型,721原理,721利用要注意什么&am…...
Mysql的索引,慢查询和数据库表的设计以及乐观锁和悲观锁
设计高性能数据表的原则 数据库设计经验和技巧 单张数据表的字段不宜过多(20个),如果确实存在大量field,考虑拆成多张表或json text存储 数据表字段都是not null的,即使没有数据,最好也使用无意义的值填充,…...
day012-软件包管理专题
文章目录 1. 生成随机密码2. 软件包管理2.1 类红帽系统2.1.1 安装软件包2.1.2 查找软件包2.1.3 查看软件包内容2.1.4 查看命令或文件属于哪个软件包2.1.5 重新安装软件包2.1.6 删除软件包2.1.7 升级2.1.8 rpm安装软件包2.1.9 rpm升级软件包2.1.10 rpm检查软件包文件是否改变 3.…...
学习黑客5 分钟深入浅出理解Windows Firewall
5 分钟深入浅出理解Windows Firewall 🔥 大家好!今天我们将探索Windows防火墙——这是Windows操作系统中的核心安全组件,负责控制进出计算机的网络流量。无论你是计算机初学者,还是在TryHackMe等平台上学习网络安全的爱好者&…...
node .js 启动基于express框架的后端服务报错解决
问题: node .js 用npm start 启动基于express框架的后端服务报错如下: /c/Program Files/nodejs/npm: line 65: 26880 Segmentation fault "$NODE_EXE" "$NPM_CLI_JS" "$" 原因分析: 遇到 /c/Program F…...
feign.RequestInterceptor 简介-笔记
1. feign.RequestInterceptor 简介 Feign 是一个声明式 Web 服务客户端,用于简化 HTTP 请求的编写与管理。feign.RequestInterceptor 是 Feign 提供的一个接口,用于在请求发出之前对其进行拦截和修改。这在微服务架构中非常有用,比如在请求中…...
软考错题(四)
在程序执行过程中,高速缓存cache与主存间的地址映射由硬件自动完成 以下关于两个浮点数相加运算的叙述中,正确的是首先进行对阶,阶码小的向阶码大的对齐 认证只能阻止主动攻击不能阻止被动攻击 BGP是外部网关协议 查看端口信息࿱…...
SSRF相关
SSRF(Server Side Request Forgery,服务器端请求伪造),攻击者以服务器的身份发送一条构造好的请求给服务器所在地内网进行探测或攻击。 产生原理: 服务器端提供了能从其他服务器应用获取数据的功能,如从指定url获取网页内容、加载指定地址的图…...
供应链学习
供应链安全 供应链:整个业务系统中的节点(一般是上游节点) 乙方一般提供资源:人 软件 硬件 服务 如何寻找供应链 1.招投标信息:寻标包 例如:烟草 智能办公 2.网站本身指纹 例如: powered by xxx…...
力扣HOT100之二叉树:226. 翻转二叉树
这道题很简单,用递归来做,对于一个根节点来说,有两种情况我们不需要翻转:一是根节点为空,二是根节点为叶子节点。这很容易理解,当传入的节点不满足上面的两种情况时,我们就需要做一个翻转&#…...
如何让rabbitmq保存服务断开重连?保证高可用?
在 Spring Boot 集成 RabbitMQ 时,可以通过以下几种方式让 RabbitMQ 保存服务断开重连,以保证高可用: 配置自动重连 application.properties 配置 :在 Spring Boot 的配置文件 application.properties 中,可以设置 Ra…...
TCPIP详解 卷1协议 九 广播和本地组播(IGMP 和 MLD)
9.1——广播和本地组播(IGMP 和 MLD) IPv4可以使用4种IP地址:单播(unicast)、任播(anycast)、组播(multicast)和广播(broadcast)。 IPv6可以使用…...
全球变暖-bfs
1.不沉的就是4个方向没有海,一个大岛屿有一个不沉就行了,其余染色就好了 2.第一个bfs来统计总岛屿个数 3.第二个来统计不沉岛屿个数 4.一减就ac啦 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typede…...
DDD领域驱动开发
1. 现象: 软件设计质量最高的时候是第一次设计的那个版本(通常是因为第一次设计时,业务技术沟通最充分,从业务技术整体视角出发设计系统)。当第一个版本设计上线以后就开始各种需求变更,这常常又会打乱原有的设计。 2…...
【HarmonyOS 5】鸿蒙App Linking详解
【HarmonyOS 5】鸿蒙App Linking详解 一、前言 HarmonyOS 的 App Linking 功能为开发者提供了一个强大的工具,通过创建跨平台的深度聚合链接,实现用户在不同场景下的无缝跳转,极大地提升了用户转化率和应用的可用性。 其安全性、智能路由和…...
Android Studio 中 build、assemble、assembleDebug 和 assembleRelease 构建 aar 的区别
上一篇:Tasks中没有build选项的解决办法 概述: 在构建 aar 包时通常会在下面的选项中进行构建,但是对于如何构建,选择哪种方式构建我还是处于懵逼状态,所以我整理了一下几种构建方式的区别以及如何选择。 1. build…...
【爬虫】12306查票
城市代码: 没有加密,关键部分: 完整代码: import json import requests with open(rE:\学习文件夹(关于爬虫)\项目实战\12306\城市代码.json,r,encodingutf-8) as f:city_codef.read() city json.loads(c…...
火山RTC 7 获得远端裸数据
一、获得远端裸数据 1、获得h264数据 1)、远端编码后视频数据监测器 /*** locale zh* type callback* region 视频管理* brief 远端编码后视频数据监测器<br>* 注意:回调函数是在 SDK 内部线程(非 UI 线程)同步抛出来的&a…...
请求参数:Header 参数,Body 参数,Path 参数,Query 参数分别是什么意思,什么样的,分别通过哪个注解获取其中的信息
在API开发中(如Spring Boot),请求参数可以通过不同方式传递,对应不同的注解获取。以下是 Header参数、Body参数、Path参数、Query参数 的区别及对应的注解: Header 参数 • 含义:通过HTTP请求头&#x…...
【Web/HarmonyOS】采用ArkTS+Web组件开发网页嵌套的全屏应用
文章目录 1、简介2、效果3、在ArkTs上全屏Web3.1、创建ArkTS应用3.2、修改模块化配置(module.json5)3.3、修改系统栏控制(ArkTS代码) 4、双网页嵌套Web实现5、ArkTSWeb技术架构的演进 1、简介 在鸿蒙应用开发领域,技术…...
Leetcode (力扣)做题记录 hot100(34,215,912,121)
力扣第34题:在排序数组中查找第一个数和最后一个数 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) class Solution {public int[] searchRange(int[] nums, int target) {int left 0;int right nums.length - 1;int[…...
Babylon.js学习之路《三、创建你的第一个 3D 场景:立方体、球体与平面》
文章目录 1. 引言:从零构建一个 3D 场景1.1 目标与成果预览1.2 前置条件 2. 初始化 Babylon.js 场景2.1 创建 HTML 骨架2.2 初始化引擎与场景 3. 创建基础几何体3.1 立方体(Box)3.2 球体(Sphere)3.3 平面(P…...
Go 语言即时通讯系统开发日志-day1:从简单消息收发 Demo 起步
Go语言即时通讯系统开发日志day1,主要模拟实现的一个简单的发送消息和接受消息的小demo,因为也才刚学习go语言的语法,对go的json、net/http库了解不多,所以了解了一下go语言的encoding/json库和net/http库,以及websock…...
AAAI-2025 | 中科院无人机导航新突破!FELA:基于细粒度对齐的无人机视觉对话导航
作者:Yifei Su, Dong An, Kehan Chen, Weichen Yu, Baiyang Ning, Yonggen Ling, Yan Huang, Liang Wang 单位:中国科学院大学人工智能学院,中科院自动化研究所模式识别与智能系统实验室,穆罕默德本扎耶德人工智能大学࿰…...
中科院无人机导航物流配送的智能变革!LogisticsVLN:基于无人机视觉语言导航的低空终端配送系统
作者:Xinyuan Zhang, Yonglin Tian, Fei Lin, Yue Liu, Jing Ma, Kornlia Sra Szatmry, Fei-Yue Wang 单位:中国科学院大学人工智能学院,中科院自动化研究所多模态人工智能系统国家重点实验室,澳门科技大学创新工程学院工程科学系…...
IP协议、以太网包头及UNIX域套接字
IP协议、以太网包头及UNIX域套接字 IP包头结构 IP协议是互联网的核心协议之一,其包头包含了丰富的信息来控制数据包的传输。让我们详细解析IPv4包头结构: 4位版本号(version):标识IP协议版本,IPv4值为4 4位首部长度(header len…...
普林斯顿数学三剑客读本分析。
这几天看了普斯林顿数学三剑客,主要看了微积分、概率论前半部分,数学分析看了目录,大体略读了一下。怎么说呢,整体上来看,是很不错的,适合平常性阅读,配套结合国内教材习题来深入还是很不错的。…...
Matlab 模糊pid的液压舵机伺服系统
1、内容简介 Matlab 235-模糊pid的液压舵机伺服系统 可以交流、咨询、答疑 2、内容说明 略 舵机是轮船,客机等机器控制系统的重要组成部分,是客机,战斗机等飞行器操作系统的关键部件,也是一种超高的精度的位置伺服系统ÿ…...
Linux基础命令之目录管理——了解各种操作文件目录的命令,万字教学,超详细!!!(1)
文章目录 前言1、Linux文件系统1.1 核心特点1.2 重要目录结构1.3 文件类型1.4 文件和目录的命名规则1.5 文件与目录的定位方式 2、查看目录或文件的详细信息(ls)2.1 基本语法2.2 常用操作2.3 高级用法 3、切换目录(cd)3.1 常用操作…...
中国黄土高原中部XF剖面磁化率和粒度数据
时间分辨率:1000年 < x空间分辨率为:空共享方式:申请获取数据大小;35.75 KB数据时间范围:743-0 ka元数据更新时间:2023-08-15 数据集摘要 该数据集包括中国黄土高原中部XF剖面磁化率和粒度数据。将所有…...