鸿蒙一次开发,多端部署(十五)常见问题

如何查询设备类型

设备类型分为default(默认设备)、tablet、tv、wearable、2in1等,有多种查询设备类型的方式。

  1. 通过命令行的方式查询设备类型。 通过命令行查询指定系统参数(const.product.devicetype)进而确定设备类型,详见 系统参数介绍 。
 # 方法一hdc shell param get "const.product.devicetype"# 方法二hdc shell cat /etc/param/ohos.para | grep const.product.devicetype
  1. 在应用开发过程中查询设备类型。

    • 通过deviceInfo查询设备类型,deviceInfo中各个字段的含义请参考 设备信息 。
 import deviceInfo from'@ohos.deviceInfo'@Entry@Componentstruct GetDeviceTypeSample {@State deviceType:string='unknown'aboutToAppear() {this.deviceType= deviceInfo.deviceType}build() {Column() {Text(this.deviceType).fontSize(24)}.width('100%').height('100%')}
}

如何在不同设备上为Ability配置不同的启动模式

应用由一个或多个Ability组成,Ability支持单实例、多实例和指定实例3种 启动模式 ,启动模式可以在 配置文件(module.json5) 中通过launchType字段配置。启动模式对应Ability被启动时的行为,对启动模式的详细说明如下:

默认设备屏幕尺寸较小,采用multiton启动模式不仅无法给用户提供便利,反而可能消耗更多系统资源,故通常采用singleton启动模式。平板屏幕尺寸较大且可能支持自由窗口,对于文档编辑、网页浏览等场景,使用multiton启动模式可以提升用户体验。

本文中将默认设备和平板等归为同一泛类,推荐同一泛类的设备共用HAP,同时本文也介绍了如何通过自适应布局能力和响应式布局能力开发出适配不同设备的页面。这里将补充介绍,如何实现Ability在不同设备上以不同的模式启动。

launchType字段配置为specified时,系统会根据AbilityStage的onAcceptWant的返回值确定是否创建新的实例。对于同一个应用,如果key已经存在,则复用该key对应的Ability,如果key不存在则新创建Ability。

可以将配置文件中的launchType字段配置为specified,同时在应用中加入如下代码以实现目标效果。

  • 非平板设备,直接将设备类型作为key,保证每次启动的key相同,即以单实例模式运行。

  • 平板设备,将设备类型与毫秒级时间戳叠加作为key,保证每次启动的key不同,即以多实例模式运行。

// MyAbilityStage.ts
import AbilityStage from "@ohos.app.ability.AbilityStage"
import deviceInfo from'@ohos.deviceInfo'
import Want from '@ohos.app.ability.Want'export default class MyAbilityStage extends AbilityStage {...private generateKey(): string {// 如果是平板,则将设备类型和毫秒级时间戳叠加作为key,保证每次启动的key都不同if (deviceInfo.deviceType === 'tablet') {return deviceInfo.deviceType + (new Date()).valueOf()}// 如果不是平板,直接以设备类型作为key,每次启动的key相同return deviceInfo.deviceType}onAcceptWant(want: Want) : string{return this.generateKey()}
}

如何开启自由窗口

开发板上的自由窗口功能默认是关闭的,可以通过如下方式开启自由窗口功能。

# 取出开发板中的窗口配置文件,并将文件中的<decor enable="false"></decor>修改为<decor enable="true"></decor>
hdc file recv system/etc/window/resources/window_manager_config.xml ./
# 以可读写的模式重新挂载根目录,并更新开发板中的配置文件
hdc shell mount -o rw,remount /
hdc file send window_manager_config.xml system/etc/window/resources/window_manager_config.xml
# 重启开发板,配置生效
hdc shell reboot

开发板屏幕较小,通过手指操作窗口较为不便,建议外接鼠标进行操作。

  • 鼠标在应用顶部悬停,即可召唤出窗口工具栏。

  • 点击窗口工具栏中的缩放按钮(从左到右第二个),即可让应用以自由窗口的模式显示。

  • 在自由窗口模式下,可以通过拖动应用窗口的边框或顶角,改变窗口尺寸同时触发应用显示刷新。 在调整窗口尺寸的过程中,窗口尺寸可能超出屏幕尺寸。此时应用显示正常,但受限于屏幕尺寸,在屏幕中只能看到应用部分区域的显示。可以通过移动窗口位置,查看应用其它区域的显示。

如何限制自由窗口的尺寸调节范围

自适应布局可以保证窗口尺寸在一定范围内变化时,页面的显示是正常的。当窗口尺寸变化较大时,就需要额外借助响应式布局能力(如断点等)调整页面结构以保证显示正常。通常每个断点都需要开发者精心适配以获得最佳的显示效果,考虑到设计及开发成本等实际因素的限制,应用不可能适配从零到正无穷的所有窗口宽度。

不同设备或不同设备状态,系统默认的自由窗口尺寸的调节范围可能不同。开发者可以在 应用配置文件 中限制应用中各个Ability的自由窗口尺寸调节范围,配置文件中影响自由窗口尺寸调节范围的字段如下表所示。

如下所示,通过配置文件分别限制自由窗口的最大和最小尺寸。

{"module": {..."abilities": [{...        "minWindowWidth": 320,"minWindowHeight": 240,"maxWindowWidth": 1440,"maxWindowHeight": 900,"minWindowRatio": 0.5,"maxWindowRatio": 2,}]}
}

如何获取组件的尺寸

实际开发过程中,开发者可能有获取页面中某个组件或某块区域的尺寸的诉求,以便通过手动计算等进行更精确的布局计算及优化。

开发者可以通过 组件区域变化事件 (即组件显示的尺寸、位置等发生变化时触发的事件)来获取指定组件的尺寸。

如下所示,通过onAreaChange事件获取Row组件(页面中白色区域)的尺寸。

@Entry
@Component
struct OnAreaChangeSample {@State rate: number = 0.8@State info: string = ''// 底部滑块,可以通过拖拽滑块改变容器尺寸@Builder slider() {Slider({ value: this.rate * 100, min: 30, max: 80, style: SliderStyle.OutSet }).blockColor(Color.White).width('60%').onChange((value: number) => {this.rate = value / 100;}).position({ x: '20%', y: '80%' })}build() {Column() {Column() {Row() {Text(this.info).fontSize(20).lineHeight(22)}.borderRadius(12).padding(24).backgroundColor('#FFFFFF').width(this.rate * 100 + '%').onAreaChange((oldValue: Area, newValue: Area) => {this.info = JSON.stringify(newValue)})}this.slider()}.width('100%').height('100%').backgroundColor('#F1F3F5').justifyContent(FlexAlign.Center)}
}

如何解决顶部单张大图问题

解决方案

顶部背景图被拉伸时,可以通过设置背景图片的 backgroundImageSize 属性,使得图片大小能够合理显示,达到适配效果。

布局效果

参考代码

@Entry
@Component
struct ImageClip {build() {// 设置背景图片的backgroundImageSize属性,使得图片大小能够合理显示Column().width('100%').height(300).backgroundColor('#ccc').backgroundImage($r('app.media.ImageOne')).backgroundImageSize(ImageSize.Cover).backgroundImagePosition(Alignment.Center)}
}

如何解决Item内容过大

解决方案

在大屏上,Listitem内容会过大,页面整体浏览内容减少。可通过以下两种方法解决:

  • 设置List列的最小宽度和最大宽度,使List组件根据宽度自适应决定列数。
  • 借助栅格行组件 GridRow ,调整不同的断点下List组件的宽度。

布局效果

参考代码

@Entry
@Component
struct ListLayout {@State data: Resource[] = new Array(5).fill($r("app.media.image"))@State breakPoint: string = 'sm'build() {GridRow() {GridCol({ span: { sm: 12, md: 12, lg: 12 } }) {List({ space: 24 }) {ForEach(this.data, (item: Resource) => {ListItem() {Image(item).margin({ left: 12, right: 12 })}})}// 设置列最小宽度和最大宽度.lanes({ minLength: 300, maxLength: 360 }).padding(12)}}.onBreakpointChange((breakpoint: string) => {this.breakPoint = breakpoint})}
}

List() {// ...
}
// 根据断点设置List列数
.lanes(this.breakPoint === 'sm' ? 1 : 2)

如何解决Banner图片过大

解决方案

在大屏上,Swiper图片显示内容过大,可以通过增加Swiper展示图片数来调整图片显示大小。外层可以使用栅格组件 GridRow ,通过调用OnBreakpointChange事件,调整不同的断点下Swiper的前后边距,实现在不同屏幕尺寸上的显示不同Swiper图片数。

布局效果

参考代码

@Entry
@Component
struct SwiperLayout {@State data: Resource[] = new Array(5).fill($r("app.media.sky"))@State breakPoint: string = 'sm'build() {Row() {GridRow() {GridCol({ span: { sm: 12, md: 12, lg: 12 } }) {Swiper() {ForEach(this.data, (item: Resource) => {Image(item).width('100%').height(180)})}.width('100%').itemSpace(24)// 根据断点设置Swiper前后边距.prevMargin(this.breakPoint === 'sm' ? 0 : 100).nextMargin(this.breakPoint === 'sm' ? 0 : 100)}}.onBreakpointChange((breakpoint: string) => {this.breakPoint = breakpoint}).height("60%").borderWidth(2)}}
}

如何解决信息流图片过大

解决方案

针对信息流单张图片过大的情况,设置 aspectRatio 和 constrainSize 属性,可以通过对图片的布局和尺寸进行约束,达到适配效果。

布局效果

参考代码

@Entry
@Component
struct ImageConstrainSize {@State breakPoint: string = 'sm'build() {GridRow(){GridCol({ span: { sm: 12, md: 12, lg: 12 } }){Column(){Text('一次开发,多端部署,让开发者可以基于一种设计,高效构建多端可运行的应用。一次开发,多端部署,让开发者可以基于一种设计,高效构建多端可运行的应用。')// 设置aspectRatio和constrainSize属性,可以对图片的布局和尺寸进行约束Image($r('app.media.ImageTwo')).width('30%').aspectRatio(0.5).constraintSize({ maxWidth: 240, minWidth: 180 })Text('一次开发,多端部署,让开发者可以基于一种设计,高效构建多端可运行的应用。一次开发,多端部署,让开发者可以基于一种设计,高效构建多端可运行的应用。')}.alignItems(HorizontalAlign.Start)}}.onBreakpointChange((breakpoint: string) => {this.breakPoint = breakpoint})}
}

如何解决信息流_4宫格图片过大

解决方案

在大屏上,Grid组件里的4宫格图片大小过大,页面浏览区域变少。可以借助栅格行组件 GridRow 来调整不同的断点下Grid的宽度,解决大屏上Grid组件4宫格图片过大的问题。

布局效果

参考代码

@Entry
@Component
struct GridLayout {@State data: Resource[] = new Array(4).fill($r("app.media.image"))@State breakPoint: string = 'sm'build() {GridRow() {GridCol({ span: { sm: 12, md: 12, lg: 12 } }) {Column() {Text('一次开发,多端部署,让开发者可以基于一种设计,高效构建多端可运行的应用。')Grid() {ForEach(this.data, (item: Resource) => {GridItem() {Image(item).width('100%').aspectRatio(1)}})}.columnsTemplate('1fr 1fr').columnsGap(24).rowsGap(24)// 根据断点设置Grid宽度.width(this.breakPoint === 'md' ? '60%' : '100%')}.width('100%').alignItems(HorizontalAlign.Start)}}.onBreakpointChange((breakpoint: string) => {this.breakPoint = breakpoint})}
}

如何解决信息流_9宫格图片过大

解决方案

在大屏上,Grid组件里的9宫格图片大小过大,页面整体浏览内容减少,可以设置Grid组件宽度和宽高比,使Grid组件保持固定大小,不会随着屏幕尺寸变化而变化。

布局效果

参考代码

@Entry
@Component
struct GridWidth {@State data: Resource[] = new Array(9).fill($r("app.media.sky"))build() {Column() {Text('一次开发,多端部署,让开发者可以基于一种设计,高效构建多端可运行的应用。')Grid() {ForEach(this.data, (item: Resource) => {GridItem() {Image(item).width('100%').aspectRatio(1)}})}.columnsTemplate('1fr 1fr 1fr').columnsGap(12).rowsGap(12)// 设置固定宽度和宽高比.width(360).aspectRatio(1).padding(12)}.alignItems(HorizontalAlign.Start)}
}

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/284291.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件设计师笔记

计算机 运算器组成&#xff1a;算术逻辑单元(ALU)、累加寄存器(AC)、数据缓冲寄存器(DR)、状态条件寄存器()等组成。 控制器组成&#xff1a;指令寄存器(IR)、程序计数器(PC)、地址寄存器(AR)、指令译码器(ID)。 最小数据单位&#xff1a;bit 最小存储单位: byte n进制 转 1…

力扣爆刷第103天之CodeTop100五连刷1-5

力扣爆刷第103天之CodeTop100五连刷1-5 文章目录 力扣爆刷第103天之CodeTop100五连刷1-5一、3. 无重复字符的最长子串二、206. 反转链表三、146. LRU 缓存四、215. 数组中的第K个最大元素五、25. K 个一组翻转链表 一、3. 无重复字符的最长子串 题目链接&#xff1a;https://l…

使用Intellij idea编写Spark应用程序(Scala+Maven)

使用Intellij idea编写Spark应用程序(ScalaMaven) 对Scala代码进行打包编译时&#xff0c;可以采用Maven&#xff0c;也可以采用sbt&#xff0c;相对而言&#xff0c;业界更多使用sbt。这里介绍IntelliJ IDEA和Maven的组合使用方法。IntelliJ IDEA和SBT的组合使用方法&#xf…

docker实践教程,mysql中使用自定义目录实现数据挂载(二)

有一些知识点在docker实践教程&#xff0c;nginx中使用数据卷映射修改前端网页&#xff08;一&#xff09;&#xff0c;就不累述了。 下载mysql的镜像 docker pull mysql创建容器 先去Docker Hub看看mysql是怎么使用的 可知&#xff0c;运行命令为&#xff1a;&#xff08;…

SpringCloud之网关组件Gateway学习

SpringCloud之网关组件Gateway学习 GateWay简介 Spring Cloud Gateway是Spring Cloud的⼀个全新项目&#xff0c;目标是取代Netflix Zuul&#xff0c;它基于Spring5.0SpringBoot2.0WebFlux&#xff08;基于高性能的Reactor模式响应式通信框架Netty&#xff0c;异步⾮阻塞模型…

2024 用CleanMyMac X为您的MAC清理提速吧

CleanMyMac X 是由 MacPaw 公司开发的一款针对 macOS 操作系统的电脑清理工具。它可以帮助用户清理电脑中的垃圾文件、卸载不需要的软件、优化电脑性能等。它的界面简洁明了&#xff0c;操作简单易懂&#xff0c;非常适合普通用户使用。 链接: https://pan.baidu.com/s/1_TFnrI…

【技巧】ChatGPT Prompt 提示语大全

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 主要来自&#xff1a;https://github.com/f/awesome-chatgpt-prompts ChatGPT SEO提示 Contributed by: StoryChief AI Reference: 7 Powerful ChatGPT Prompts to Create SEO Content Faster 供稿人&#xff1a;…

Linux安装Nginx及配置TCP负载均衡

目录 1、安装编译工具及库文件2、下载解压Nginx压缩包3、Ngnix配置Tcp负载均衡4、配置Ngnix的文件5、Nginx启动 1、安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel pcre-devel2、下载解压Nginx压缩包 wget https://nginx.o…

【创作纪念日】1024回忆录

不知不觉中&#xff0c;从创作第一篇文章到现在&#xff0c;已经1024天了&#xff0c;两年多的时间里&#xff0c;已经从硕士到博士了&#xff0c;1024&#xff0c;对于程序员来说&#xff0c;是个特别的数字吧&#xff0c;在此回忆与记录一下这些美好的经历吧。 缘起 很早以前…

MySQL面试题--开发(最全,涵盖SQL基础、架构、事务)

MySQL面试题--事务https://mp.csdn.net/mp_blog/creation/editor/136947072 MySQL面试题--MySQL内部技术架构https://blog.csdn.net/Timebro/article/details/136946046?spm1001.2014.3001.5501 MySQL面试题--最全面-索引https://blog.csdn.net/Timebro/article/details/136…

列车票务信息管理系统设计与实现|jsp+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW调试部署环境&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java…

kali安装docker(亲测有效)

第一步&#xff1a;添加Docker官方的GPG密钥 curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - 第二步&#xff1a; 第二步更新源 echo deb https://download.docker.com/linux/debian stretch stable> /etc/apt/sources.list.d/docker.list…

鸿蒙Harmony应用开发—ArkTS-枚举说明

说明&#xff1a; 本模块首批接口从API version 7开始支持&#xff0c;后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 Color 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 颜色名称颜色值颜色示意Black0x000000 Blue0x0000ff Brown…

C#中右键通过listview来控制datagridview字段值的是否显示、显示顺序,并存储到XML中。

最终显示效果&#xff0c;如下图所示&#xff1a; datagridview开始显示通过调用XML存储的字段值及顺序来显示&#xff0c;右键调出Tools来控制显示的顺序及是否显示&#xff0c;通过加号和减号进行调整顺序。 XML存储字段值及顺序 主要代码及事件&#xff1a; 获取datagridv…

ARM CPU的总线发展

ARM架构是当今世界上最为广泛应用的嵌入式处理器架构之一&#xff0c;其CPU总线的发展对于系统性能和扩展性具有重要影响。本文将探讨ARM CPU总线的发展历程、关键技术和对系统性能的影响。 以下是我整理的关于嵌入式开发的一些入门级资料&#xff0c;免费分享给大家&#xff…

Orbit 使用指南 10|在机器人上安装传感器 | Isaac Sim | Omniverse

如是我闻&#xff1a; 资产类&#xff08;asset classes&#xff09;允许我们创建和模拟机器人&#xff0c;而传感器 (sensors) 则帮助我们获取关于环境的信息&#xff0c;获取不同的本体感知和外界感知信息。例如&#xff0c;摄像头传感器可用于获取环境的视觉信息&#xff0c…

Spring中的OAuth2

一. 什么是OAuth2 “Auth” 表示 “授权” Authorization “O” 是 Open 的简称&#xff0c;表示 “开放” 连在一起就表示 “开放授权”&#xff0c;OAuth2是一种开放授权协议。 二. OAuth2是什么 怎么用 OAuth2是目前最流行的授权协议&#xff0c;用来授权第三方应用&am…

基于霍夫检测(hough变换)的人眼瞳孔定位,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

git 上传文件夹至远端仓库的方法

上传的远端git可以是gitlab、github、gitee、gitblit或者gitCode等等 以下以GitHub为例说明&#xff1a; 1、登录GitHub网站&#xff08;账户/密码&#xff09; 2、创建一个新的空白项目&#xff08;或者已有的项目&#xff09;hello-world 分支是master &#xff0c;这里默认即…

[MAUI]集成高德地图组件至.NET MAUI Blazor项目

文章目录 前期准备&#xff1a;注册高德开发者并创建 key登录控制台创建 key获取 key 和密钥 创建项目创建JS API Loader配置权限创建定义创建模型创建地图组件创建交互逻辑 项目地址 地图组件在手机App中常用地理相关业务&#xff0c;如查看线下门店&#xff0c;设置导航&…