近期,首届 HarmonyOS 开发者翻新大赛正式落下帷幕。大赛共历时 5 个月,超过 3000 支队伍的 10000 多名选手参赛,25000 多位开发者参加了大赛学习,最终 23 支参赛队伍斩获奖项,产出了多款有翻新、有创意、有价值的优秀作品。其中由“Labo Lado 儿童艺术创想”团队打造的《Labo 涂鸦鸿蒙亲子版》就是其中之一,其创造性地通过 HarmonyOS 分布式技术,实现了多设施下的亲子互动涂鸦性能,最终摘得大赛一等奖。
在很早以前,“Labo Lado 儿童艺术创想”团队就做过一款涂鸦游戏的利用,该利用能够让孩子和父母在一个平板或者手机上进行绘画较量,较量的形式就是屏幕一分为二,两人各在设施的一边进行涂鸦。这种形式尽管乏味,然而对于绘画而言,屏幕尺寸限度了用户的施展和操作。因而团队心愿这类玩法能通过多个设施实现,于是他们钻研了 ZeroConf、iOS 的 Multipeer Connectivity、Google Nearby 等近距离互联的技术, 后果发现这些技术在设施发现和利用拉起方面实现的都不现实,尤其是当指标用户是儿童的状况下,操作起来不够简便也不易上手。
HarmonyOS 的呈现给团队带来了心愿。他们发现 HarmonyOS 的分布式技术有着很大的利用后劲,这项技术让设施的发现和利用拉起变的十分的简略天然,互联的过程也很晦涩,很好地解决了单机操作的限度,让跨设施联机性能可能非常容易地实现。此外,HarmonyOS 的开发也给团队留下了很粗浅的印象,以往繁琐的开发步骤,在 HarmonyOS 中仅需几个配置、几行代码即可实现,无需破费太多精力。在《Labo 涂鸦鸿蒙亲子版》外面的 5 个分布式玩法的开发只用了团队一名开发者不到两个月的工夫,其中还包含了学习上手、解决文档不全和各种疑难问题的过程。
以下是“Labo Lado 儿童艺术创想”团队基于 HarmonyOS 的分布式开发关键技术的简略分享:
一、分布式技术实际
HarmonyOS 的分布式能力是在零碎层面实现的,在设施单方同属一个局域网的状况下,设施都能够疾速的发现和进行晦涩的通信。上面将从 HarmonyOS 设施的发现、利用的拉起、利用通信和双向通信几个局部来进行分享。
1、设施的发现
假如设施 A 想要邀请另外一个设施 B 退出,AB 任何一方都无需启动特地的播送服务,只有发起方设施 A 在利用内调用设施发现代码,就能够列出左近符合条件可用的的设施。
以下是获取设施列表的示例代码:
public static List<DeviceInfo> getRemoteDevice() {
List<DeviceInfo> deviceInfoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
return deviceInfoList;
}
列出设施之后,用户就能够通过设施名抉择想要邀请的设施了。
(左侧设施 A 发现右侧名为“ye”的设施 B 的界面展现)
2、利用的拉起
设施 A 邀请了设施 B 之后,如果设施 B 上利用没启动, 设施 A 可间接通过调用 startAbility 办法来拉起设施 B 上的利用。单方利用都启动了之后,就能够进行 RPC 通信了。如果须要当时查看设施 B 上的利用是否曾经启动或者是否在后盾,可通过在利用中减少一个 PA 来实现。在拉起之前,设施 A 先连贯设施 B 的利用中的 PA 能够实现更简单精准的近程利用启动管制。
3、利用通信
在利用中启动一个 PA,专门用作通信的服务器端。当设施 B 的利用被拉起之后,设施 A 就会通过 connectAbility 与设施 B 的 PA 进行连贯,通信采纳 RPC 形式实现,并应用 IDL 定义通信接口。
4、双向通信
RPC 的通信形式应用简略,然而只能反对单向通信。为了实现双向通信,可在设施 A 与设施 B 发动建设连贯胜利之后,再让设施 B 与设施 A 发动建设一个连贯,用两个连贯实现了双向通信。上面是这两个连贯建设过程的示意时序图:
在设施 A 与设施 B 建设连贯的时候,设施 A 必须将本人的 DeviceId 发送给设施 B, 而后设施 B 才能够被动发动一个与设施 A 的连贯,获取以后设施的 DeviceId 办法如下:
KvManagerFactory.getInstance().createKvManager(new KvManagerConfig(this)).getLocalDeviceInfo().getId()
利用中,FA 次要实现了界面层逻辑,PA 局部用做数据通讯的服务端。为了避免拉起利用导致用户当后面的操作被中断,可通过 PA 来查问以后 FA 的状态,如果 FA 曾经启动了,就跳过拉起,间接进行下一步操作即可。
二、数据接口与数据结构定义
应用了 IDL 定义了两个通用的接口,别离用来进行异步和同步调用:
int sendSyncCommand([in] int command, [in] String params);
void sendAsyncCommand([in] int command, [in] String params, [in] byte[] content);
大部分状况下,近程调用大部分都通过同步的形式进行,用户之间的绘画数据通过异步接口传输,数据在用户绘制的时候采集,每 50ms 左右发送一次,这个频率能够大略保障用户视觉上没有卡顿,而又不至于因为接口适度调用导致卡顿或者耗电量过大。采集的绘画数据的数据结构大抵如下:
enum action // 动作,示意落笔、挪动、提笔等动作
int tagId // 多点触摸辨认标记
int x // x 坐标
int y // y 坐标
enum brushType // 笔刷类型
int brushSize // 笔刷大小
enum brushColor // 笔刷色彩
int layer // 图层
这款利用是反对多点触摸的,所以每个触摸点在落笔的的时候,都应用了 tagId 进行标记。这些数据除了通信外,还会残缺地保留在文件中,这样用户就能够通过利用内的播放性能播放该数据,回看绘画的整个过程。
三、教程录制与曲线平滑
1、教程制作
这款产品的特色之一是教程是动静的,用户能够本人拼装或者通过游戏生成教程角色。目前利用内置六种教程。这些教程事后由设计师在 photoshop 中画好并标记各个部位,而后再通过专门的 photoshop 脚本导出到教程录制利用中,再由设计师按部位一一进行临摹绘制,绘制实现,利用会将设计师的绘制过程数据保留为 json 文件,通过将这些 json 的文件里的部位调换,咱们就实现了用户本人拼装教程的性能了。
2、曲线平滑
绘制过程,为了让用户绘制的曲线更加平滑,采纳二次贝塞尔曲线算法进行差值(Quadratic Bezier Curve),该算法简略效率也十分不错:
public Point quadraticBezier(Point p0, Point p1, Point p2, float t) {
Point pFinal = new Point();
pFinal.x = (float) (Math.pow(1 – t, 2) p0.x + (1 – t) 2 t p1.x + t t p2.x);
pFinal.y = (float) (Math.pow(1 – t, 2) p0.y + (1 – t) 2 t p1.y + t t p2.y);
return pFinal;
}
基于 HarmonyOS 的分布式个性,《Labo 涂鸦鸿蒙亲子版》实现了一次已有利用的自我尝试和冲破,大大的减少了用户在应用过程中的乐趣,为用户带来了全新的跨设施亲子交互体验,“Labo Lado 儿童艺术创想”团队在将来将与更多的 HarmonyOS 开发者一起,为用户创作出更多更乏味的儿童发明类利用。
近一段时间以来,HarmonyOS 2 的公布吸引了宽广开发者的关注。作为一款面向万物互联时代的智能终端操作系统,HarmonyOS 2 带来了诸多新个性、新性能和新玩法,期待开发者去摸索、去学习、去实际。也欢送宽广开发者持续施展创造力和想象力,基于 HarmonyOS 开发出更多有翻新、有创意、有价值的作品,打造出专属于万物互联时代的翻新产品。