ArkUI-X案例解析
目前,已经有按照方案完成整体改造的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案例解析的更多相关文章
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
- SQL Server 连接问题案例解析(1)
SQL Server 连接问题案例解析(1) 转载自:http://blogs.msdn.com/b/apgcdsd/archive/2015/04/27/sql.aspx?CommentPosted ...
- 【java设计模式】(6)---迭代器模式(案例解析)
设计模式之迭代器模式 一.java迭代器介绍 1.迭代器接口 在jdk中,与迭代器相关的接口有两个:Iterator 与 Iterable. Iterator:迭代器,Iterator及其子类通常是迭 ...
- 案例解析|政府信息化的BI建设应用 .
一.行业背景 某建设厅综合监管信息化平台,是政企业务协同的平台之一,同时兼具协作.门户.办公应用集成.用户权限管理等多项功能.在此要求基础上,选择中间件基础技术平台,可以在最大程度满足平台功能需求的前 ...
- 《高性能SQL调优精要与案例解析》——10.4_SQL语句改写部分文档
应各位读者要求,现将<高性能SQL调优精要与案例解析>中<10.4 SQL语句改写>部分整理成电子文档,上传至群共享文件(群号:298176197): 或者通过如下链接下载: ...
- 《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(SQL TUNING或SQL优化)核心机制之——索引(index)
继<高性能SQL调优精要与案例解析>一书谈SQL调优(SQL TUNING或SQL优化),我们今天就谈谈各主流关系库中,占据SQL调优技术和工作半壁江山的.最重要的核心机制之一——索引(i ...
- 《高性能SQL调优精要与案例解析》一书谈SQL调优(SQL TUNING或SQL优化)学习
<高性能SQL调优精要与案例解析>一书上市发售以来,很多热心读者就该书内容及一些具体问题提出了疑问,因读者众多外加本人日常工作的繁忙 ,在这里就SQL调优学习进行讨论并对热点问题统一作答. ...
- 安全之路:Web渗透技术及实战案例解析(第2版)
安全之路:Web渗透技术及实战案例解析(第2版)
- (转)Rsync 排错案例解析
Rsync 排错案例解析 原文:http://blog.51cto.com/irow10/1827306 错误一. 执行计划任务的备份脚本后没有看到备份的文件 1.首先查看crontab日志是否执行文 ...
- 《gis空间分析及应用案例解析》培训总结
<gis空间分析及应用案例解析>培训总结 来源:常德水情 作者:唐校准 发布日期:2014-01-02 2013年12月2630日由中国科学院计算技术研究所教育中心组织的< ...
随机推荐
- JDK7-时间类、时间格式化类--java进阶day07
1.Date类:表示时间的类 1.Date常用的构造方法 . 2.Date常用的成员方法 1.getTime:返回从时间原点到对象设定的时间之间的时间 2.setTime:将对象的时间设置为setTi ...
- 《机器人SLAM导航核心技术与实战》第1季:第7章_SLAM中的数学基础
<机器人SLAM导航核心技术与实战>第1季:第7章_SLAM中的数学基础 视频讲解 [第1季]7.第7章_SLAM中的数学基础-视频讲解 [第1季]7.1.第7章_SLAM中的数学基础_S ...
- Pycharm两种快速激活方式(附最新激活码和插件)
小张的Pycharm最近弹出提示框 Your license has expired提示过期....纳尼!!!! 是不是看到这个也很头疼,.于是我就在想有没有一种方式可以让他永久免费的,于是小张从网上 ...
- 在类 Unix 系统中将 Nginx 源码导入 CLion 并调试运行
零.写在最前面 0.1 关于系统 如标题所述,本文的操作需要一个类 Unix 系统(MacOS.CentOS.Ubuntu 等). 同时这些类 Unix 系统还需要有 gcc 编译器.具体如何搞定这些 ...
- CocoaPods+Gitee 制作私有库过程以及错误总结
前言 最近由于要做组件化,所以就顺便看了看私有库的制作,整体上制作的过程是比较简单的,但有一些点你注意到的话会在制作过程会少去很多的麻烦,在网上搜的制作过程的文章是一大把,但当你真的遇到一些问题的时候 ...
- 在MaxKB中实现准确的Chat TO SQL(BI)
主要面向考试成绩管理系统(目前支持旭日图.仪表盘柱状图.桑基图.漏斗图.河流图.数据聚合图.散点图.南丁格尔玫瑰图.饼状图.环形图.堆叠柱状图.堆叠折线图.堆叠面积图.面积图.折线图) 主要思路: 第 ...
- kettle+report designer导出带样式的excel包含多个sheet页
场景介绍: 运用pentaho report designer报表设计器,查询数据库字典表生成带有样式的excel,通过kettle pentaho报表输出组件导出形成数据字典,最终形成的数据字典样式 ...
- 2025dsfz集训Day4:BFS及其优化
DAY4: BFS及其优化 \[Designed\ By\ FrankWkd\ -\ Luogu@Lwj54joy,uid=845400 \] 特别感谢 此次课的主讲 - Kwling BFS 广度优 ...
- C# 线程(二)——Thread学习
参照:C#多线程 - .NET开发菜鸟 - 博客园 (cnblogs.com) C# Thread 线程状态知识 - 大圣的笑 - 博客园 (cnblogs.com) 背景: 在.NET Framew ...
- 痞子衡嵌入式:在含多个i.MXRT的主从系统中共享一颗Flash启动的方法与实践(上篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是多个i.MXRT共享一颗Flash启动的方法. 有些特殊的客户应用会采用多颗 i.MXRT 芯片设计一主多从的硬件架构(目的不一,或仿多 ...