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

如何查询设备类型

设备类型分为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.mzph.cn/news/767079.shtml

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

相关文章

Linux(Centos)安装mysql 8 并且使用systemctl管理服务

1.下载mysql包 地址 MySQL :: Download MySQL Community Server (Archived Versions) 注&#xff1a;下载我圈住的减压之后里面会有tar.gz 再次减压才会是软件主体 2.安装和准备 yum -y install numactl 安装numactl tar -xvf mysql-8.0.30-el7-x86_64.tar 拆分 …

逆向爬虫技术的进阶应用与实战技巧

前言 在互联网的海洋中&#xff0c;数据是无价的财富。爬虫技术作为获取这些数据的重要手段&#xff0c;一直备受关注。然而&#xff0c;随着网站反爬虫机制的日益完善&#xff0c;简单的爬虫程序已经很难满足我们的需求。因此&#xff0c;掌握爬虫逆向技术&#xff0c;突破反爬…

【计算机网络篇】数据链路层(3)差错检测

文章目录 &#x1f95a;误码&#x1f354;两种常见的检错技术⭐奇偶校验⭐循环冗余校验&#x1f388;例子 &#x1f95a;误码 误码首先介绍误码的相关概念 &#x1f354;两种常见的检错技术 ⭐奇偶校验 奇校验是在待发送的数据后面添加1个校验位&#xff0c;使得添加该校验…

NVIDIA最新 Blackwell架构简介

NVIDIA Blackwell架构简介 在AI和大型语言模型&#xff08;LLMs&#xff09;迅速发展的领域中&#xff0c;追求实时性能和可扩展性至关重要。从医疗保健到汽车行业&#xff0c;组织正深入探索生成性AI和加速计算解决方案的领域。对生成性AI解决方案的需求激增&#xff0c;促使企…

【前端寻宝之路】学习和使用表单标签和表单控件

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-cR8zvB8CkpxTk485 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

Linux——生产者消费者模型

为何要使用生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯&#xff0c;而通过阻塞队列来进行通讯&#xff0c;所以生产者生产完数据之后不用等待消费者处理&#xff0c;直接扔给阻塞队列&#xff0c;…

MUNIK第二届功能安全及自动驾驶研讨会将在沪召开

2024年4月26日,由上海秒尼科技术服务有限公司(以下简称“Munik”)联合Parosoft主办的“第二届功能安全及自动驾驶研讨会”将在上海虹桥隆重开幕。 据了解,本次功能与自动驾驶安全研讨会,将聚焦在ISO 26262标准体系下,自动驾驶新形势下各个零部件供应商如何满足功能安全等相关重…

论文解读:Relational Embedding for Few-Shot Classification

文章汇总 问题 最近的方法通过元学习一个深度嵌入函数来解决小样本问题&#xff0c;使得嵌入空间上图像之间的距离符合它们的语义距离。然而&#xff0c;学习到的嵌入函数经常会过度拟合到不相关的特征[4,9,14]&#xff0c;从而无法迁移到训练中尚未观察到的新类。 动机 与…

web自动化--元素定位之xpath和css

元素定位 xpath绝对路径相对路径案例xpath策略&#xff08;路径&#xff09;案例xpath策略&#xff08;层级、扩展&#xff09;属性层级与属性层级与属性拓展层级与属性综合 csscss选择器&#xff08;id、类、标签、属性&#xff09;id选择器类选择器标签选择器属性选择器案例-…

重看Spring聚焦BeanFactory分析

目录 一、理解BeanFactory &#xff08;一&#xff09;功能性理解 &#xff08;二&#xff09;BeanFactory和它的子接口 &#xff08;三&#xff09;BeanFactory的实现类 二、BeanFactory根接口 &#xff08;一&#xff09;源码展示和理解 &#xff08;二&#xff09;基…

增强现实(AR)在广告中的力量

The Power of AR in Advertising 写在前面 增强现实&#xff08;AR -Augmented Reality&#xff09;是指借助软件、应用程序和智能手机、平板电脑或耳机等设备&#xff0c;为日常生活添加视觉和音频元素的技术。如今&#xff0c;品牌和广告商可以在营销活动中使用AR&#xff0…

IT运维服务规范标准与实施细则

一、 总则 本部分规定了 IT 运维服务支撑系统的应用需求&#xff0c;包括 IT 运维服务模型与模式、 IT 运维服务管理体系、以及 IT 运维服务和管理能力评估与提升途径。 二、 参考标准 下列文件中的条款通过本部分的引用而成为本部分的条款。凡是注日期的引用文件&#xff0c…

Python通过Ctypes调用C++类,实测有效

文章目录 前言创建vs dll工程添加外部库编辑代码编译测试参考 前言 在软件开发中&#xff0c;有时候需要Python与C相结合&#xff0c;以充分发挥两者的优势 。Python作为一种高级编程语言&#xff0c;具有简洁易读的特点&#xff0c;适用于快速开发和原型设计。而C则是一种性能…

【运维笔记】VM 记录一次centos虚拟机和宿主机之间ping不通的问题

问题描述 环境&#xff1a;centos7&#xff0c;静态ipVM版本&#xff1a;VMware Workstation 16 pro&#xff0c;网络为nat映射模式问题&#xff1a; 一开始&#xff0c;虚拟机可以ping通宿主机&#xff0c;也可以ping通&#xff0c;也可以ping通外网&#xff08;如 ping www.…

38 mars3d 对接地图图层 绘制点线面员

前言 这里主要是展示一下 mars3d 的一个基础的使用 主要是设计 接入地图服务器的 卫星地图, 普通的二维地图, 增加地区标记 基础绘制 点线面园 等等 测试用例 <template><div style"width: 1920px; height:1080px;"><div class"mars3dClas…

②零基础MySQL数据库-MySQL约束

作用 表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性&#xff0c;比如用户表有些列的值&#xff08;手机号&#xff09;不能为空&#xff0c;有些列的值&#xff08;身份证号&#xff09;不能重复 分类 主键约束(primary key) PK 自增长约束(auto_increme…

string类的详细模拟实现

string类的模拟实现 文章目录 string类的模拟实现前言1. 类的框架设计2. 构造函数与析构函数3. 拷贝构造与重载赋值运算符函数4. 运算符重载5. 成员函数6. 迭代器的实现7. 非成员函数8. 单元测试总结 前言 ​ 在现代编程中&#xff0c;字符串处理是每个程序员都会遇到的基本任…

家用路由器和企业路由器的区别?

一、家用路由器 家用路由器路由器交换机 它只有一个WAN口和一个LAN口&#xff0c;WAN口接公网一个地址&#xff0c;LAN口接你电脑一个IP地址&#xff0c;完全符合路由器的设计&#xff0c;而因为家里如果用了&#xff0c;说明要接多个电脑&#xff0c;那么如果还需要对每个接口…

pandas的综合练习

事先说明&#xff1a; 由于每次都要导入库和处理中文乱码问题&#xff0c;我都是在最前面先写好&#xff0c;后面的代码就不在写了。要是copy到自己本地的话&#xff0c;就要把下面的代码也copy下。 # 准备工作import pandas as pd import numpy as np from matplotlib impor…

卷积篇 | YOLOv8改进之主干网络中引入可变形卷积DConv

前言:Hello大家好,我是小哥谈。可变形卷积模块是一种改进的卷积操作,它可以更好地适应物体的形状和尺寸,提高模型的鲁棒性。可变形卷积模块的实现方式是在标准卷积操作中增加一个偏移量offset,使卷积核能够在训练过程中扩展到更大的范围,从而实现对尺度、长宽比和旋转等各…