2.3.2 “一次开发,多端部署”的用户程序开发体验
原子化服务的一个关键特征是跨端运行,但不同终端之间的差异很大,如系统能力不同导致API集合不同,屏幕尺寸不一致,屏幕分辨率和纵横比有较大差异,内存大小及CPU处理能力都不尽相同。如何实现跨端运行原子化服务?如果让用户程序开发者自己完成跨端能力的开发,即使对于高级用户程序开发者也显得过于苛刻,更不必说对于大多数普通开发者了。所以,HarmonyOS在系统层面提供了一套开发和运行环境,让用户程序开发者很方便地就能开发出跨端运行的原子化服务,这就显得非常迫切和必要。
为了实现“一次开发,多端部署”,系统至少需要解决3个问题。
● 第一个问题是GUI的自适应问题,即超百种不同分辨率和不同尺寸的屏幕的适配问题,以及横屏、竖屏、刘海屏、圆形屏、折叠屏等各种异形屏幕的适配问题。
● 第二个问题是统一交互问题。不同终端的输入方式通常差异很大,譬如可能通过语音、触摸、表冠、键盘、鼠标、手写笔等输入,需要系统对不同输入方式进行统一处理。
● 第三个问题是不同设备的软硬件能力差异问题。
要解决这些问题,最核心的方案就是要实现用户程序与具体设备的解耦,把具体设备和用户程序结构抽象化,“一次开发,多端部署”的实现原理如图2-5所示。对GUI来讲,系统需要对物理屏幕和GUI信息结构分别进行抽象;对统一输入来讲,系统需要对设备的输入事件进行归一化抽象;对硬件能力的差异来讲,系统需要对硬件的能力集进行抽象。需要强调的一点是,原子化服务不管运行的物理设备的GUI如何变化,它要完成的核心业务能力是一致的,不会随GUI的变化而变化。而且前文提到用户在不同设备上通过用户程序可以访问同一用户数据,而不感知数据具体存储在哪台设备上,这就要求HarmonyOS的原子化服务的基本设计逻辑必须实现“GUI—业务逻辑—数据”的3层解耦。
图2-5 “一次开发,多端部署”的实现原理
1. 多设备显示差异
武术家李小龙曾说过:“当你把水倒入杯子的时候,水就变成了杯子的样子;当你把水倒入瓶子的时候,水就变成了瓶子的样子;当你把水倒入茶壶的时候,水就变成了茶壶的样子。”自适应布局就是要我们把要显示的信息想象成水,把屏幕想象成一个玻璃容器。如果要显示的信息只有大小一致的文字,它就像水一样,可以很好地填满各种尺寸的屏幕。如果要显示的信息的文字大小不一致,或者包含图像、表格等其他非文字信息,该如何布局呢?HarmonyOS的解决方案是在GUI设计和开发层面提供多种响应式布局方案,即通过对屏幕进行栅格化抽象来提供不同屏幕的界面适配能力。不同设备屏幕的栅格化如图2-6所示。
注:1 inch=2.54 cm;vp即virtual pixel,虚拟像素。
图2-6 不同设备屏幕的栅格化
图2-7给出了设备屏幕栅格化后的GUI布局示例。
图2-7 设备屏幕栅格化后的GUI布局示例
可以通过改变元素的相对位置来适应环境的变化。图2-8列举了改变相对位置的5种自适应布局能力。
图2-8 改变相对位置的5种自适应布局能力
也可以通过改变元素自身尺寸来适应环境的变化。图2-9列举了改变自身尺寸的2种自适应布局能力。
图2-9 改变自身尺寸的2种自适应布局能力
通过上述布局能力的组合,可以屏蔽不同设备屏幕的显示差异,带给开发者统一的GUI设计体验。下面通过一个具体的例子来展现如何综合运用上述布局能力实现自适应布局,如图2-10所示。
图2-10 自适应布局的示例说明
2. 多设备交互差异
如何对多设备的输入事件进行归一化?以缩放交互为例,在单设备场景下,譬如在手机触摸屏上,用户通过多指触控完成缩放动作,而在分布式场景下,缩放交互有多种不同的输入方式,那么,如何让用户程序更好地支持这些交互?
首先需要完成缩放交互的规则设计,如表2-1所示。
表2-1 缩放交互的规则设计
然后通过构建的交互事件归一化框架,提炼出“缩放”这一抽象事件。缩放控件只处理缩放事件,不再对鼠标、键盘、触摸屏等设备上发生的物理事件进行处理。缩放控件的处理流程如图2-11所示。
图2-11 缩放控件的处理流程
最后建立交互事件归一化框架,完成事件归一化处理,如图2-12所示。
图2-12 交互事件归一化框架原理
3. 多设备能力差异
多设备能力差异主要表现为设备内存、主频差异大,硬件平台能力差异大。操作系统为了适配不同设备,需要对能力进行裁剪,无法确保所有设备的系统能力一致,用户程序开发难以实现统一开发、统一运行。为了解决这个问题,HarmonyOS提供应用层统一的开发范式,如图2-13所示,支持用户程序在不同内存设备上部署运行。
图2-13 统一的开发范式
需要指出的是,如果用户程序依赖差异化能力,用户程序需要感知当前运行的设备的具体能力,这就要求用户程序能够根据当前设备的特定能力进行相关的业务分支处理。例如,当某一设备具备GPS精准定位能力时,用户程序可以按照用户当前所处的具体位置为用户推荐业务;当该设备不具备GPS精准定位能力,而具备粗粒度的网络定位能力时,用户程序可以按距离用户位置的远近为用户推荐业务;当该设备不具备定位能力时,则不向用户推荐业务。HarmonyOS通过SystemCapability对设备能力进行抽象描述,用户程序可以通过相关API来查询当前设备是否支持某一能力,如图2-14所示。
图2-14 通过SystemCapability对设备能力进行抽象描述