0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ArkUI 3.0让多设备开发更简单!

HarmonyOS开发者 来源:HarmonyOS开发者 作者:wanglei 2021-11-01 11:22 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:wanglei,华为UI编程框架技术专家

HarmonyOS自诞生以来,就是为满足分布式多设备应用场景而设计的,大到智慧屏、车机、平板,小到手机、手表。在多设备场景下进行应用UI界面开发,面临新的困难与挑战

为了使UI界面在色彩风格、屏幕尺寸、交互方式和组件功能等差异下仍能够正常显示,无疑需要开发人员花费大量精力在UI适配。开发人员常常需要实现多套界面布局(甚至多套工程),来满足不同设备间的设计差异。即使页面差异不大,也需要进行多设备测试,多次打包编译在设备或者模拟器上运行查看效果。后期维护过程中也需要不断查看不同设备下的兼容性,这些都极大地增加了应用开发者的工作量。

为了解决上述问题,简化开发者在多设备上的开发调试成本,我们提出了一次开发多端部署的设计理念,实现通过一套工程代码,一次开发上架,即可按需部署到不同设备。为了实现这一目标,我们从Harmony系统能力ArkUI 3.0框架能力开发工具能力三个方面,为开发者提供了多种适配方法和能力。下面将一一为大家介绍。

一、HarmonyOS系统能力

首先介绍一下系统层面提供的能力。系统能力无需开发者进行页面调整,也无需进行业务逻辑调整,仅通过增加简单的几行配置描述,即可由系统进行多设备适配。系统能力与开发范式无关,因此在新的UI编程框架下仍可使用。下面我们依次介绍两种系统能力:模拟小窗和平行视界。

1. 模拟小窗

模拟小窗是最常用也是最简单的一种多设备适配方式,通过利用系统的悬浮窗能力,将低分辨率的应用,以悬浮窗口的形式在高分辨率屏幕上进行显示。常见的使用场景是手机应用在平板或PC上运行的场景,如下图所示:

模拟小窗的使用方式非常简单,只需在项目中config.json文件中增加两条描述,分别配置好应用的目标设备类型和响应的窗口尺寸,即可将低分辨率的应用运行在高分辨率设备上。示例代码如下:

{  “app”: {    ...    “smartWindowSize”:“360*640”,    “smartWindowDeviceType”: [      “tablet”    ]  },  ...}

(左右滑动,查看更多)

这种使用方式能够良好地保证我们应用的展示效果和原始平台效果是一致的,无需开发者进行额外的界面的适配。但是这种方式也有局限,最显著的问题就是没有办法利用全部高分辨率的屏幕,整个屏幕内展示的数据量没有因屏幕分辨率的增加而增大,造成了屏幕上空间的浪费。为解决此问题,系统提供了另一种适配方案——平行视界。

2. 平行视界

系统针对折叠屏、平板设备提供了平行视界的能力,借助分屏显示的思想,将屏幕分为左右两个部分,分别显示应用相关联的两个页面内容。这样每个区域都能够保持良好的界面显示效果,也增加了屏幕内的有效数据量,良好地利用了屏幕显示区域。常用于新闻、购物类的场景,将相关的两个页面同时显示,如下图所示:

使用平行视界时,首先需要在config.json文件中配置metaData,声明支持平行视界。同时,还需要增加easygo.json文件进行页面路由关系配置,指导系统进行分屏显示。

平行视界的详细使用说明,可参考官网:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/multi-device-ui-app-multiplier-guidelines-0000001135848428

二、ArkUI 3.0框架能力

上述两种是通过配置即可实现的多端适配方案,使用简单,但是使用场景比较受限。为了更加精准地适配多设备界面,ArkUI 3.0框架提供了媒体查询、多态控件、原子布局和栅格系统,方便开发者选择合适的能力进行UI界面构建。

1. 媒体查询

媒体查询是CSS提供的标准能力,是响应式Web设计的关键部分。在新的UI范式中仍保留了此能力,作为最基础的UI响应式设计能力。在新的UI范式中,通过API接口方式对外提供媒体查询能力,可以探查的范围包括页面尺寸、设备分辨率、屏幕方向、页面宽高比、屏幕尺寸、设备类型、屏幕类型和主题模式。开发者可以根据不同的查询结果,进行定制化处理。比如:当屏幕方向变化时,可以调整界面内布局样式和组件显示效果;也可以根据设备类型不同,控制组件的显示和隐藏;并且当查询状态发生变化时,提供事件通知。

2. 多态组件

UI界面构建离不开组件的使用。ArkUI 3.0框架为开发者提供了多态组件,通过组件将不同设备的样式风格和交互方式进行封装,替开发者完成大部分适配相关工作。开发者在使用多态组件时,无需考虑设备差异,只需关注功能实现即可。

下面通过一个示例来看看,相同的一套开发代码在手机、智慧屏和车机上展示的不同效果。

示例代码如下:

Column(){Text("手机/平板").margin({top:150})Button("普通按钮").margin({top:40}).onClick(()=>{AlertDialog.show({title:'发现新版本',message:'当前使用移动数据网络,将消耗XXXMB流量,是否更新',primaryButton:{value:'立即更新',action:()=>{}},secondaryButton:{value:'以后再说',action:()=>{}}})})}

(左右滑动,查看更多)

产品设计人员常常不满足于使用系统默认样式,希望能够针对不同的平台使用自定义的风格样式。为了避免开发者逐个组件地进行样式调整,ArkUI 3.0框架将组件样式相关设置信息(如颜色、尺寸、圆角弧度、内容文本等)抽象出来形成了一个参数表,按照参数名称和参数值的方式进行映射。UI组件样式属性值都来自这张参数表,开发者和设计人员只需调整参数值,即可调整组件的显示效果。

3. 原子布局

多设备间差异最大的还是屏幕的分辨率,差异分辨率适配离不开自适应布局的能力。针对常见的开发场景,我们提炼了七种原子布局能力。这些布局可以独立使用,也可多种布局叠加使用。下面我们依次介绍这七种原子布局能力:

(1)折行布局:常用于横竖屏适配或手机向平板切换的场景。比如,竖直方向空间减少,但是水平方向上显示区域增加,这时可考虑使用折行布局,将竖直方向的排版变成水平方向。

折行布局利用了Flex布局的折行能力实现,配合布局约束设置,即可实现折行排布效果。示例代码如下:

  Flex({direction: FlexDirection.Column, wrap: FlexWrap.Wrap}) {    Flex({justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center}) {      Text("First Content")      .fontColor(Color.White)      .fontSize(30)    }    .constraintSize({minWidth: '50%', minHeight: '50%', maxWidth: 400})    .backgroundColor(Color.Gray)    Flex({justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center}) {      Text("Second Content")      .fontSize(30)      .fontColor(Color.White)    }    .constraintSize({minWidth: '50%', minHeight: '50%', maxWidth: 400})    .backgroundColor('rgb(207, 171, 103)')

(2)均分布局:常用于内容数量固定、均分显示的场景,比如工具栏、底部菜单栏等。

示例代码如下:

@Entry@ComponentstructIndex{build(){Flex({direction:FlexDirection.Row,alignItems:ItemAlign.Center,justifyContent:FlexAlign.SpaceEvenly}){Text('Hello').fontSize(20).borderColor(Color.Red).borderWidth(1)Text('World').fontSize(20).borderColor(Color.Red).borderWidth(1)Text('Ark').fontSize(20).borderColor(Color.Red).borderWidth(1)Text('UI').fontSize(20).borderColor(Color.Red).borderWidth(1)}.width('100%').height('100%')}}

仅需配置为FlexAlign.SpaceEvenly模式,即可在Flex组件中将内容均分显示。

(3)隐藏布局:是一种比较高级的布局方式,常用于分辨率变化较大,且不同分辨率下显示内容有所差异的场景。主要思想是通过增加或减少显示内容,来保持最佳的显示效果。比如媒体播放控制器,在宽屏场景可以完整显示全部控制项(包含播放、暂停、上一首、下一首、快进、快退,可能还有点赞和收藏按钮等),而在低分辨率场景只保留部分控制项(比如播放、暂停、上一首、下一首按钮)。

隐藏布局使用方式非常简单,只需通过displayPriority方法设置显示优先级,具有相同优先级的元素会同时显示或隐藏。在进行布局计算时,会根据当前可用空间,计算当前可显示组件进行显示。示例代码如下:

Row({space: 10}) {  Text('1')    .width(100)    .textAlign(TextAlign.Center)    .fontSize(40)    .backgroundColor(Color.Red)    .displayPriority(2)  Text('2')    .width(100)    .fontSize(40)    .textAlign(TextAlign.Center)    .backgroundColor(Color.Red)    .displayPriority(1)  Text('3')    .width(100)    .textAlign(TextAlign.Center)    .fontSize(40)    .backgroundColor(Color.Red)    .displayPriority(3)  Text('4')    .width(100)    .textAlign(TextAlign.Center)    .fontSize(40)    .backgroundColor(Color.Red)    .displayPriority(1)  Text('5')    .width(100)    .textAlign(TextAlign.Center)    .fontSize(40)    .backgroundColor(Color.Red)    .displayPriority(2)}

(4)占比布局:是一种很常见的布局,就是根据容器尺寸按照比例进行显示。

通过设置百分比尺寸,即可实现比例调整。示例代码如下:

@Entry@ComponentstructIndex{build(){Row(){Text('Hello').fontSize(20).width('50%').backgroundColor(Color.Red)Text('World').fontSize(20).width('20%').backgroundColor(Color.Yellow)Text('Ark').fontSize(20).width('15%').backgroundColor(Color.Green)Text('UI').fontSize(20).width('15%').backgroundColor(Color.Gray)}.width('100%').height('100%')}}

左右滑动,查看更多)

(5)拉伸缩放布局:组件尺寸跟随父容器尺寸变化,产生拉伸或缩放的展示效果。

通过设置相对容器的比例,实现拉伸或缩放的展示效果。示例代码如下:

Row(){Image($r('app.media.background')).objectFit(ImageFit.Fill).width('100%').height('100%')    }

左右滑动,查看更多)

(6)固定宽高比布局:在拉伸缩放时保持自身宽高比,通常用于图片缩放场景中,可保持图片显示效果正常,避免图片被拉长或压瘪,引起显示失真。

通过设置宽高比,保持按照固定宽高比进行拉伸显示,保障图片不会产生变形。示例代码如下:

Row(){Image($r('app.media.background')).objectFit(ImageFit.Fill).width('100%').height('100%').aspectRatio(1.2)}

左右滑动,查看更多)

(7)延伸布局:根据尺寸调整内容显示数量,主要是通过像列表这样的能力来实现。

根据宽度不同,显示不同数量的内容,并且可以通过滑动操作,显示出更多内容。示例代码如下:

@Entry@ComponentstructIndex{privatedata:string[]=['Hello','World','Ark','UI','This','Is','Layout','Demo']build(){Flex({direction:FlexDirection.Column,justifyContent:FlexAlign.Center}){List({space:10}){ForEach(this.data,(item)=>{ListItem(){Text(item).fontSize(20).width(80)}.height(80).backgroundColor(Color.Red)})}.listDirection(Axis.Horizontal).width('100%').height(100)}.width('100%').height('100%')}}

左右滑动,查看更多)

此示例通过List作为布局容器,进行内容线性排布,并支持滑动响应。

4. 栅格系统

ArkUI 3.0框架还提供了完整的栅格系统。所谓栅格系统是来自UX设计中的栅格设计,将屏幕宽度按照不同数量的栅格划分为不同的列,组件的尺寸占用一个或多个栅格。采用这种方式进行设计的布局系统,称之为栅格系统。使用栅格系统,可以屏蔽屏幕分辨率的差异,在不同分辨率的屏幕上保持显示内容的相对尺寸一致。

常见的栅格系统有8栅格系统和12栅格系统,而我们提供的是动态栅格系统,可以根据不同的屏幕尺寸,动态地调整栅格数量。使用动态栅格系统时,不同分辨率的设备使用不同的栅格配置,比如:手机竖屏采用4栅格系统,手机横屏和折叠屏采用8栅格系统,大屏采用12栅格系统。

为了方便开发者使用,ArkUI 3.0框架提供了栅格布局容器GridContainer。下面我们来看一个示例,代码如下:

Stack(){GridContainer({sizeType:SizeType.Auto}){Row(){Button('OK').fontSize(30).gridSpan(2).useSizeType({lg:4})}}}

左右滑动,查看更多)

栅格布局容器可以设置为固定栅格数,也可以设置为Auto模式。此示例采用的是Auto模式,栅格布局容器会根据宽度动态调整栅格数量。同时通过useSizeType属性方法,可以设置在不同栅格模式下,组件占用的栅格数量。比如:“.useSizeType({lg: 4})”表示在large栅格系统(即12栅格系统)中,Button组件宽度占用4栅格显示。

三、开发工具能力

除了上面的系统能力和ArkUI 3.0框架能力外,我们还从开发工具(DevEco Studio)方面,为开发者提供了各种各样的开发模板,以及多设备预览等能力,减少开发者的开发调试成本,提升开发效率。

1. 开发模板

开发模板主要包括工程模板和卡片模板。

  • 工程模板:DevEco Studio预置了丰富的工程模板,可以根据工程向导轻松创建适应于各类设备的工程,并自动生成对应的代码和资源模板。创建工程时,开发者可以挑选合适的工程模板。
  • 卡片模板:DevEco Studio提供了多种类型的卡片模板,开发者可以根据需要展示的信息类型灵活选择模板,快速构建服务卡片。

2. 多设备预览

DevEco Studio还支持多设备预览能力,开发者可以在同一窗口中,同时查看多种设备下UI界面的展示效果。预览器与真机设备采用相同渲染引擎和UI框架,可以最大程度地做到预览效果与真机运行效果的一致。以下视频展示了多设备预览能力: 感兴趣的小伙伴,可以从官网下载和体验DevEco Studio新版本:

https://developer.harmonyos.com/cn/develop/deveco-studio

四、结束语

实现完美的一次开发多端部署效果,离不开开发者的参与。UI开发框架和系统在实现一次开发多端部署的过程中进行了初步的探索,也期待开发者能反馈更多的多设备UI开发过程中的痛点,以及期待系统框架提供的能力。欢迎开发者和我们一起,在开源社区将一次开发多端部署的能力丰富起来!

编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ui
    ui
    +关注

    关注

    0

    文章

    208

    浏览量

    22238
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73154
  • 智慧屏
    +关注

    关注

    2

    文章

    364

    浏览量

    20330
  • HarmonyOS
    +关注

    关注

    80

    文章

    2146

    浏览量

    35585

原文标题:HDC2021技术分论坛:ArkUI 3.0让多设备开发更简单!

文章出处:【微信号:HarmonyOS_Dev,微信公众号:HarmonyOS开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    TQKIT开发板工具系统功能调用简单

    TQKIT开发板工具,将复杂的系统控制能力以接口形式开放给开发者,系统功能调用简单
    的头像 发表于 12-08 09:27 114次阅读
    TQKIT<b class='flag-5'>开发</b>板工具<b class='flag-5'>让</b>系统功能调用<b class='flag-5'>更</b><b class='flag-5'>简单</b>

    米尔RK3576核心板,360环视技术开发简单

    与软件整合难度大,项目周期过长。这些问题导致360环视技术开发往往成本高昂,项目落地周期长,阻碍了技术的大规模普及。 米尔RK3576核心板:360环视变简单的关键选择针对开发中的痛
    发表于 08-06 18:13

    思必驰天穹3.0交互自由随心

    作为全屋智能语音交互系统,天穹3.0基于思必驰中枢大模型构建,融合了全链路语音交互技术,采用“云端 + SDK”架构,云端有多个大模型协同运行,能够高效解决全屋智控场景中的诸多问题,为用户提供自由、随心的语音交互体验,家居生活更美好。
    的头像 发表于 07-01 14:44 705次阅读

    【HarmonyOS next】ArkUI-X休闲娱乐搞笑日历【基础】

    包括动态主题适配、AI图片内容识别等,进一步提升跨设备体验一致性。真正的跨平台开发,不是追求像素级一致,而是每个设备都展现出最佳状态——这正是Ar
    发表于 06-28 22:07

    【HarmonyOS next】ArkUI-X新闻热搜聚合App【进阶】

    API,展示了平台榜单数据并支持网页详情查看。项目采用ArkUI框架开发,现通过ArkUI-X实现iOS平台的无缝迁移。 1.2 核心技术栈 HarmonyOS:原生
    发表于 06-28 21:43

    【HarmonyOS next】ArkUI-X休闲益智儿童拼图【进阶】

    一、前言:当拼图遇上跨端开发 最近在开发一款跨平台的儿童拼图游戏时,我深刻体会到了ArkUI-X框架的威力——同一套代码竟能同时在华为Mate60 Pro和iPhone15上流畅运行!这不仅节省
    发表于 06-28 21:41

    【HarmonyOS next】ArkUI-X休闲益智猜字谜【基础】

    (已内置ArkUI-X支持) ?测试设备 :华为Mate60Pro、iPhone15(一次开发双端运行) ?️开发语言 :ArkTS(TypeScript的超集,学习成本低) ?框架版
    发表于 06-26 20:01

    ArkUI介绍

    ArkUI(方舟UI框架)为应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能(组件、布局、动画以及交互事件),以及实时界面预览工具等,可以支持开发者进行可视化界面开发
    发表于 06-24 06:41

    ArkUI-X应用工程结构说明

    简介 本文档配套ArkUI-X,将OpenHarmony ArkUI开发框架扩展到不同的OS平台,比如Android和iOS平台,让开发者基于Ark
    发表于 06-19 23:11

    ArkUI-X跨平台技术落地-华为运动健康(一)

    的设计策略: 1.运动健康首页历史逻辑复杂,涉及的模块并且改造包袱重,仍使用原生页面native开发技术。 2.在运动健康内部的二级页面(如心脏健康、睡眠等页面)使用ArkUI-X技术,实现页面级别
    发表于 06-18 22:53

    ArkUI-X跨平台应用改造指南

    ArkUI-X跨平台应用改造指南 现状与诉求 随着 HarmonyOS Next 5.0 版本正式发布,众多开发者基于 ArkTS 语言为 HarmonyOS Next 系统开发了大量应用,这极大
    发表于 06-16 23:05

    ArkUI-X框架LogInterface使用指南

    WARN/INFO/DEBUG),存在应用崩溃的风险。 注意:开发者使用时注册,必须位于调用MyApplication超类的onCreate()方法之后 设置ArkUI-X框架
    发表于 06-15 23:20

    ArkUI-X跨平台框架接入指南

    ,就可以构建支持平台的精美、高性能应用。 使用DevEco Studio开发ArkUI-X约束说明 DevEco Studio仅支持ArkUI-X源码
    发表于 05-18 18:21

    爱立信如何网络运维简单

    在爱立信“可编程网络”这一创新概念里,差异化连接、AI赋能和意图驱动、网络能力开放作为三大基石,各司其职,网络智能、更灵活、开放。本期《信观察》,爱立信专家将从AI赋能和意图驱动的概念和功能入手,与您分享爱立信如何“
    的头像 发表于 03-03 09:27 1w次阅读

    华为推出RN/H5设备自适应组件库

    在原生鸿蒙应用开发中,华为针对ArkUI框架推出了一整套针对设备适配的完善能力(如“一”能力)以及高阶组件(如分栏、边看边评等),帮助
    的头像 发表于 01-16 14:46 1578次阅读