目前,已经有按照方案完成整体改造的4个Sample作为完整案例。

应用描述 链接
鸿蒙世界 HMOSWorld
溪村小镇 OxHornCampus
音乐专辑 MusicHome
购物应用 MultiShopping

下面以实际改造过程中遇到的经典问题进行案例详解。

Products共性拆分Products共性拆分

在拆分原工程products模块为两个hap时,将可以复用的代码进行抽象,存于features层main,被hap依赖使用。

首先识别可以复用的代码逻辑部分,以溪村小镇为例,应用启动页会轮播三张图片,而图片源的数据结构作为可复用部分,将其存放于features层main中。

模块main 对外暴露 数据结构

// OxHornCampus\features\main\Index.ets

// 对外暴露数据源
export { splashImages } from './src/main/ets/viewmodel/SplashModel';

arkuix和harmonyos使用时添加对模块main的依赖,即可访问数据。

// OxHornCampus\products\phone\arkuix\oh-package.json5
// harmonyos同理 {
"name": "arkuix",
"version": "1.0.0",
"description": "Please describe the basic information.",
"main": "",
"author": "",
"license": "",
"dependencies": {
"@ohos/utils": "file:../../../commons/utils",
"@ohos/map": "file:../../../features/map",
"@ohos/zones": "file:../../../features/zones",
"@ohos/train": "file:../../../features/train",
//添加模块依赖
"@ohos/main": "file:../../../features/main",
}
}

Products差异性性拆分

以鸿蒙世界为例,HarmonyOS Next设备上应用持有5个tab页,其中 tabs“溪村挑战赛” 使用了harmonyos的独有能力进行UI设计。由于无法通过Bridge实现跨平台改造,因此需要在Android/iOS平台部署时删除该tab页相关元素,同时相关数据结构等根据平台独立设计,分别存放于harmonyos.hap 和 arkuix.hap。

arkuix侧不存在“CHALLENGE”数据项。harmonyos侧存在“CHALLENGE”数据项。

最终实现效果

harmonyos包展示效果,存在tab页“溪村挑战赛”

arkuix包展示效果,没有tab页“溪村挑战赛”

使用支持跨平台的UI控件、属性、方法进行跨平台开发

在音乐专辑中,当音乐播放时,播放控制栏的音乐图标会执行旋转动画,实际上HarmonyOS Next与Android/iOS使用了两套逻辑实现。

在HarmonyOS Next上。使用@ohos.graphics.displaySync (可变帧率)实现动画效果。

// DisplaySyncLocal.ets

import { displaySync } from '@kit.ArkGraphics2D';
import { DisplaySyncInterface } from '../Interface/DisplaySyncInterface'; export class DisplaySyncLocal implements DisplaySyncInterface {
private static instance: DisplaySyncLocal;
private backDisplaySyncSlow: displaySync.DisplaySync | undefined = undefined; public static getInstance(): DisplaySyncInterface {
if (!DisplaySyncLocal.instance) {
DisplaySyncLocal.instance = new DisplaySyncLocal();
}
return DisplaySyncLocal.instance;
} public createAnimate(range: ExpectedFrameRateRange, frame: () => void): void {
this.backDisplaySyncSlow = undefined;
this.backDisplaySyncSlow = displaySync.create();
this.backDisplaySyncSlow.setExpectedFrameRateRange(range);
this.backDisplaySyncSlow.on('frame', frame);
} public deleteAnimate(frame: () => void): void {
if (this.backDisplaySyncSlow != undefined) {
this.backDisplaySyncSlow?.off('frame', frame);
this.backDisplaySyncSlow = undefined;
}
} public startAnimate(): void {
if (this.backDisplaySyncSlow != undefined) {
this.backDisplaySyncSlow?.start();
}
} public stopAnimate(): void {
if (this.backDisplaySyncSlow != undefined) {
this.backDisplaySyncSlow?.stop();
}
}
}

由于当前ArkUI-X框架未适配这套方法,在arkui-x侧实际上使用了@ohos.animator (动画)实现动画效果。

// DisplaySyncArkUIX.ets

import { Animator, AnimatorResult } from '@kit.ArkUI';
import { DisplaySyncInterface } from '../Interface/DisplaySyncInterface'; export class DisplaySyncArkUIX implements DisplaySyncInterface {
private static instance: DisplaySyncArkUIX;
private backAnimator: AnimatorResult | undefined = undefined; public static getInstance(): DisplaySyncInterface {
if (!DisplaySyncArkUIX.instance) {
DisplaySyncArkUIX.instance = new DisplaySyncArkUIX();
}
return DisplaySyncArkUIX.instance;
} public createAnimate(range: ExpectedFrameRateRange, frame: () => void): void {
this.backAnimator = undefined;
this.backAnimator = Animator.create({
duration: 5000,
easing: "linear",
delay: 0,
fill: "forwards",
direction: "normal",
iterations: -1,
begin: 0,
end: 1
})
this.backAnimator.setExpectedFrameRateRange(range);
this.backAnimator.onFrame = frame;
} public deleteAnimate(frame: () => void): void {
if (this.backAnimator != undefined) {
this.backAnimator.cancel();
this.backAnimator = undefined;
}
} public startAnimate(): void {
if (this.backAnimator != undefined) {
this.backAnimator.play();
}
} public stopAnimate(): void {
if (this.backAnimator != undefined) {
this.backAnimator.pause();
}
}
}

关于DevEco Studio编译时报错问题解决

问题现象:DevEco Studio编译hap时报错:“ xxx can't support crossplatform application. ”

问题解析:由于使用了跨平台工程模版,DevEco Studio在进行静态编译检查时会检查跨平台标签“@crossplatform”。而在工程中会使用一些当前不支持跨平台的HarmonyOS 接口导致静态编译检查失败。

解决方法:

1.找到 IDE 里配套 OH-SDK;如果是HarmonyOS Next开发,则是HarmonyOS 里带的oh-sdk。

简便方法:前提需保证工程使用SDK为正确的。使用DevEco Studio打卡任一工程,在工程中打开并查看任一d.ts文件,于文件名右键点击-->选择 打开范围-->选择 Explorer 点击,打开的文件窗口即为当前工程所使用的SDK路径,于文件窗口回到SDK根目录执行第2步。

2.找到文件:" api_check_util.js "。文件在SDK中的相对路径为:

sdk\HarmonyOS-NEXT-DB1\openharmony\ets\build-tools\ets-loader\lib\fast_build\system_api\api_check_utils.js

3.在文件" api_check_util.js "中搜索关键字:CROSSPLATFORM_TAG_CHECK_ERROER,将其后边的 DiagnosticCategory.Error 修改为 DiagnosticCategory.Warning。

4.回到DevEco Studio 如果当前工程已编译过,先执行clean操作;之后执行操作: 点击文件-->选择 清理缓存 点击--> 勾选选项 --> 点击清除并重新启动。



约束与建议

本方案是依据ArkUI-X框架来实现的,应首先符合ArkUI-X框架的规格要求.

在应用UI方面存在的差异,是无法借助Bridge能力来弥补的。在此建议使用ArkUI-X框架中已经适配完毕的组件,这些组件功能相对稳定且较为全面。

应用改造过程中可能涉及通过Bridge框架使用平台原生接口方法,使用时需满足相应的原生系统版本要求。

ArkUI-X案例解析的更多相关文章

  1. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  2. SQL Server 连接问题案例解析(1)

    SQL Server 连接问题案例解析(1) 转载自:http://blogs.msdn.com/b/apgcdsd/archive/2015/04/27/sql.aspx?CommentPosted ...

  3. 【java设计模式】(6)---迭代器模式(案例解析)

    设计模式之迭代器模式 一.java迭代器介绍 1.迭代器接口 在jdk中,与迭代器相关的接口有两个:Iterator 与 Iterable. Iterator:迭代器,Iterator及其子类通常是迭 ...

  4. 案例解析|政府信息化的BI建设应用 .

    一.行业背景 某建设厅综合监管信息化平台,是政企业务协同的平台之一,同时兼具协作.门户.办公应用集成.用户权限管理等多项功能.在此要求基础上,选择中间件基础技术平台,可以在最大程度满足平台功能需求的前 ...

  5. 《高性能SQL调优精要与案例解析》——10.4_SQL语句改写部分文档

    应各位读者要求,现将<高性能SQL调优精要与案例解析>中<10.4 SQL语句改写>部分整理成电子文档,上传至群共享文件(群号:298176197): 或者通过如下链接下载: ...

  6. 《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(SQL TUNING或SQL优化)核心机制之——索引(index)

    继<高性能SQL调优精要与案例解析>一书谈SQL调优(SQL TUNING或SQL优化),我们今天就谈谈各主流关系库中,占据SQL调优技术和工作半壁江山的.最重要的核心机制之一——索引(i ...

  7. 《高性能SQL调优精要与案例解析》一书谈SQL调优(SQL TUNING或SQL优化)学习

    <高性能SQL调优精要与案例解析>一书上市发售以来,很多热心读者就该书内容及一些具体问题提出了疑问,因读者众多外加本人日常工作的繁忙 ,在这里就SQL调优学习进行讨论并对热点问题统一作答. ...

  8. 安全之路:Web渗透技术及实战案例解析(第2版)

    安全之路:Web渗透技术及实战案例解析(第2版)

  9. (转)Rsync 排错案例解析

    Rsync 排错案例解析 原文:http://blog.51cto.com/irow10/1827306 错误一. 执行计划任务的备份脚本后没有看到备份的文件 1.首先查看crontab日志是否执行文 ...

  10. 《gis空间分析及应用案例解析》培训总结

    <gis空间分析及应用案例解析>培训总结 来源:常德水情 作者:唐校准 发布日期:2014-01-02       2013年12月2630日由中国科学院计算技术研究所教育中心组织的< ...

随机推荐

  1. JDK7-时间类、时间格式化类--java进阶day07

    1.Date类:表示时间的类 1.Date常用的构造方法 . 2.Date常用的成员方法 1.getTime:返回从时间原点到对象设定的时间之间的时间 2.setTime:将对象的时间设置为setTi ...

  2. 《机器人SLAM导航核心技术与实战》第1季:第7章_SLAM中的数学基础

    <机器人SLAM导航核心技术与实战>第1季:第7章_SLAM中的数学基础 视频讲解 [第1季]7.第7章_SLAM中的数学基础-视频讲解 [第1季]7.1.第7章_SLAM中的数学基础_S ...

  3. Pycharm两种快速激活方式(附最新激活码和插件)

    小张的Pycharm最近弹出提示框 Your license has expired提示过期....纳尼!!!! 是不是看到这个也很头疼,.于是我就在想有没有一种方式可以让他永久免费的,于是小张从网上 ...

  4. 在类 Unix 系统中将 Nginx 源码导入 CLion 并调试运行

    零.写在最前面 0.1 关于系统 如标题所述,本文的操作需要一个类 Unix 系统(MacOS.CentOS.Ubuntu 等). 同时这些类 Unix 系统还需要有 gcc 编译器.具体如何搞定这些 ...

  5. CocoaPods+Gitee 制作私有库过程以及错误总结

    前言 最近由于要做组件化,所以就顺便看了看私有库的制作,整体上制作的过程是比较简单的,但有一些点你注意到的话会在制作过程会少去很多的麻烦,在网上搜的制作过程的文章是一大把,但当你真的遇到一些问题的时候 ...

  6. 在MaxKB中实现准确的Chat TO SQL(BI)

    主要面向考试成绩管理系统(目前支持旭日图.仪表盘柱状图.桑基图.漏斗图.河流图.数据聚合图.散点图.南丁格尔玫瑰图.饼状图.环形图.堆叠柱状图.堆叠折线图.堆叠面积图.面积图.折线图) 主要思路: 第 ...

  7. kettle+report designer导出带样式的excel包含多个sheet页

    场景介绍: 运用pentaho report designer报表设计器,查询数据库字典表生成带有样式的excel,通过kettle pentaho报表输出组件导出形成数据字典,最终形成的数据字典样式 ...

  8. 2025dsfz集训Day4:BFS及其优化

    DAY4: BFS及其优化 \[Designed\ By\ FrankWkd\ -\ Luogu@Lwj54joy,uid=845400 \] 特别感谢 此次课的主讲 - Kwling BFS 广度优 ...

  9. C# 线程(二)——Thread学习

    参照:C#多线程 - .NET开发菜鸟 - 博客园 (cnblogs.com) C# Thread 线程状态知识 - 大圣的笑 - 博客园 (cnblogs.com) 背景: 在.NET Framew ...

  10. 痞子衡嵌入式:在含多个i.MXRT的主从系统中共享一颗Flash启动的方法与实践(上篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是多个i.MXRT共享一颗Flash启动的方法. 有些特殊的客户应用会采用多颗 i.MXRT 芯片设计一主多从的硬件架构(目的不一,或仿多 ...