当前位置: 首页 > news >正文

鸿蒙5.0项目开发——横竖屏切换开发

横竖屏切换开发

【高心星出品】

文章目录

      • 横竖屏切换开发
        • 运行效果
        • 窗口旋转
        • 配置module.json5的orientation字段
        • 调用窗口的setPreferredOrientation方法
        • 案例代码解析
          • Index1页面代码:
          • EntryAbility在module.json5的配置信息:
          • Index页面的代码信息:

横竖屏切换功能即实现应用内既支持竖屏显示也支持横屏显示的效果。对于应用内不同页面显示方向不同的情况,需要在应用逻辑中,动态修改窗口方向,来实现该效果,例如包含视频播放功能的应用,首页内容是采用竖屏方式,而视频详情页则采用横屏方式展示。

运行效果

在这里插入图片描述

窗口旋转

目前在HarmonyOS系统中,窗口的旋转形态包括以下四种,窗口的状态对应真机实际状态如下:

在这里插入图片描述

有两种设置窗口旋转策略的方式:

通过module.json5文件中“orientation”字段进行设置

在代码中通过调用窗口window的setPreferredOrientation方法进行设置

这两种方式触发设置旋转的时机不同,总的来说,module.json5文件中的字段在窗口启动时就会生效,对于应用启动时就需要设置横屏或者竖屏的应用,需要进行配置。而setPreferredOrientation是在调用该方法时进行窗口方向的设置,用于在应用启动之后,还需要改变显示方向的场景。

配置module.json5的orientation字段

此字段配置的是应用启动时的窗口显示状态,对于开屏时就需要以默认的横屏或者竖屏方式显示,需要在此字段进行相应的配置:


{"module": {// ..."abilities": [{"name": "EntryAbility",// ..."orientation": "portrait"}]}
}

其支持的参数可以参考module.json5配置项中orientation字段相关配置的orientation字段说明:

根据应用默认的旋转行为进行相应的配置:

  • 如果应用是竖屏应用,建议配置portrait为默认旋转策略。

  • 如果应用是横屏应用,例如游戏类应用,进入游戏时,默认就是横屏,此时有两种情况:

    一、仅支持横屏,建议配置landscape为默认旋转策略。

    二、支持在横屏和反向横屏中切换,建议设置为auto_rotation_landscape。

  • 如果应用为可旋转应用,建议应用配置auto_rotation_restricted为默认旋转策略。

  • 如果一个应用,在直板机和折叠机折叠态是竖屏应用,在平板和折叠机展开态默认是可旋转应用,推荐配置follow_desktop为默认旋转策略。

调用窗口的setPreferredOrientation方法

对于需要进入应用后,修改应用窗口显示横竖屏状态的情况下,可以调用setPreferredOrientation方法进行设置,典型场景如一些视频类应用、图片类应用等。

在这里插入图片描述

此类应用在进入时为竖屏,而在视频播放页面可以显示为横屏,则需要支持用户临时修改窗口方向。由于setPreferredOrientation方法调用的是窗口的显示方向,是整个应用窗口级别都发生了旋转,窗口将一直保持最后一次设置窗口方向的效果,即使发生页面跳转等行为窗口方向也不会发生变化。

案例代码解析

本项目Entry模块中有两个ability,入口ability为EntryAbility1加载的Index1页面,该页面只有一个按钮,点击跳转到EntryAbility敞口,该窗口加载为竖屏展示,并加载了Index页面。

Index1页面代码:
import { common, Want } from '@kit.AbilityKit';@Entry
@Component
struct Index1 {@State message: string = 'Hello World';private context:common.UIAbilityContext=getContext(this) as common.UIAbilityContextbuild() {Column(){Button('跳转').width('60%').onClick(()=>{let params:Record<string,Object>={'from':'EntryAbility1','count':10}let want:Want={moduleName:'entry',bundleName:'com.gxx.orientationdemo',abilityName:'EntryAbility',parameters:params}//跳转到Entryabilitythis.context.startAbility(want,(err,data)=>{if(err){console.error('gxxt ',JSON.stringify(err.message))return}console.log('gxxt ',JSON.stringify(data))})})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}
EntryAbility在module.json5的配置信息:
{"name": "EntryAbility","srcEntry": "./ets/entryability/EntryAbility.ets","description": "$string:EntryAbility_desc","icon": "$media:layered_image","label": "$string:EntryAbility_label","startWindowIcon": "$media:startIcon","startWindowBackground": "$color:start_window_background",//默认为竖屏展示"orientation": "portrait","exported": true,
},
Index页面的代码信息:
import { common } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';@Entry
@Component
struct Index {private context:common.UIAbilityContext=getContext(this) as common.UIAbilityContext//默认为竖屏@State orientation:string='portrait'aboutToAppear(): void {this.context.windowStage.getMainWindowSync().on('windowSizeChange',(size)=>{let wid=px2vp(size.width)let hei=px2vp(size.height)if(wid>hei){//横屏this.orientation='landscape'}else{//竖屏this.orientation='portrait'}})}build() {// 通过不同的水平 展示不同的界面if(this.orientation==='portrait') {this.gencontent()}else{this.gencontent1()}}@Buildergencontent() {Column({ space: 20 }) {Text('块1').width(200).height(200).backgroundColor(Color.Red).textAlign(TextAlign.Center).fontColor(Color.White).fontWeight(FontWeight.Bolder).fontSize(30)Text('块2').width(200).height(200).backgroundColor(Color.Blue).textAlign(TextAlign.Center).fontColor(Color.White).fontWeight(FontWeight.Bolder).fontSize(30)Button('切换屏幕').width('50%').onClick(() => {let window1 = this.context.windowStage.getMainWindowSync()window1.setPreferredOrientation(this.orientation === 'portrait' ? window.Orientation.LANDSCAPE :window.Orientation.PORTRAIT)})}.width('100%').height('100%')}@Buildergencontent1() {Column({space:20}) {Row({space:20}) {Text('块1').width(200).height(200).backgroundColor(Color.Red).textAlign(TextAlign.Center).fontColor(Color.White).fontWeight(FontWeight.Bolder).fontSize(30)Text('块2').width(200).height(200).backgroundColor(Color.Blue).textAlign(TextAlign.Center).fontColor(Color.White).fontWeight(FontWeight.Bolder).fontSize(30)}.width('100%').justifyContent(FlexAlign.Center)Button('切换屏幕').width('50%').onClick(() => {let window1 = this.context.windowStage.getMainWindowSync()window1.setPreferredOrientation(this.orientation === 'portrait' ? window.Orientation.LANDSCAPE :window.Orientation.PORTRAIT)})}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}
http://www.xdnf.cn/news/793423.html

相关文章:

  • 深入解析 Java 中的 synchronized:从使用到底层原理的全面详解
  • C++中锁和原子操作的区别及取舍
  • 楼宇自控系统联动暖通空调:解密建筑环境舒适度提升路径
  • 域自适应 (Domain Adaptation,DA)基础
  • JS对数据类型的检测
  • TitanIDE智算版:一键开启云端算法开发环境
  • Servlet 生命周期
  • 高性能MCU的MPU与Cache优化详解
  • 线性动态规划
  • 张雪峰为9岁女儿申请40个左右商标!
  • 超声波粒度仪市场报告:行业现状、竞争格局与未来趋势分析
  • 原子操作与非原子操作
  • RTOS,其高级使用
  • TypeScript中class的两种继承方式extends和implements的对比
  • HTML5新特性
  • DAY 20 奇异值SVD分解
  • ant-design-vue select 下拉框不好用解决
  • Nginx 的配置文件
  • GCC内存占用统计使用指南
  • 【Android】双指旋转手势
  • AI 驱动工业:应用场景、挑战与未来趋势
  • SP网络结构:现代密码学的核心设计
  • SAP是什么?SAP概述
  • 免费论文查重与AI检测工具推荐
  • NVIDIA NVLink Fusion 是 PCIe Gen5 的 14 倍
  • pcie 日常问答-20250528
  • 累乘法求数列的通项公式
  • 手撕HashMap!(JDK7版本)
  • Unreal Niagara制作炫酷VJ粒子
  • 深入解析域名解析:原理、流程与应用实践