ArkUI-X案例解析

简介: 本文介绍了基于ArkUI-X框架实现的4个完整应用改造案例,包括鸿蒙世界、溪村小镇、音乐专辑和购物应用。通过共性代码复用与差异功能适配,实现了跨平台开发中的模块拆分与统一管理。以溪村小镇为例,展示了如何将可复用的数据结构抽离至features层供多个hap依赖使用;以鸿蒙世界为例,说明了因平台能力不同导致的UI与数据结构差异化处理方式。此外,还介绍了音乐专辑中播放动画在不同平台上的实现逻辑,并提供了解决DevEco Studio编译报错的方法。最后强调了在应用改造过程中应遵循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框架使用平台原生接口方法,使用时需满足相应的原生系统版本要求。

相关文章
|
2月前
|
存储 IDE 开发工具
ArkUI-X跨平台框架接入指南
ArkUI-X是ArkUI的跨平台扩展框架,支持OpenHarmony、Android和iOS等多平台开发,未来还将增加更多平台支持。开发者只需一套主代码即可构建高性能、精美的多平台应用。使用DevEco Studio进行ArkUI-X开发时,需注意:仅支持ArkUI-X源码调试,各平台Native代码需用对应IDE处理;支持真机与模拟器调试;需配置相关SDK(如Android SDK)及环境变量(如ANDROID_HOME)。创建工程后,可通过DevEco Studio编译生成跨平台应用包,并在不同平台上运行查看效果。
230 64
|
23天前
|
监控
货拉拉抢单开挂的软件,自动接单抢单辅助脚本插件,autojs加速器版
这个示例展示了AutoJS的基本UI构建、事件处理和模拟逻辑。实际实现需要针对货拉拉司机端APP的具体界面元素进行适配
|
29天前
|
移动开发 开发工具 Android开发
ArkUI-X跨平台技术落地-华为运动健康(二)
本文介绍了ArkUI-X在华为运动健康应用中的实践,涵盖原生与ArkUI界面参数传递、跨平台bridge桥接通信、平台差异化动态编译处理及性能表现。通过intent与putExtra()实现页面参数传递,定义5类bridge(数据、设备、页面跳转、日志、用户账户)提升跨平台与原生交互能力。采用编译前动态修改import技术屏蔽多端差异,确保业务代码复用。ArkUI-X跨平台页面达到60fps滑动帧率,包体积增加19MB,内存表现与原生持平。目前心脏健康模块已在iOS商用,Android版处于Beta阶段,未来将迁移更多高频模块至ArkUI-X框架,进一步提升开发效率与用户体验。
|
1月前
|
JSON API Android开发
ArkUI-x跨平台Bridge最佳实践
ArkUI-X框架的bridge核心架构思想旨在实现ArkTS与平台原生语言(如Java、OC)之间的通信,支持业务层通信及跨平台API中转。bridge具备三种能力:多种桥接模式(JSON、二进制、线程并发)、数据与方法互传,以及“一码三平台”支持。通过分层架构设计,上层业务调用统一接口,下层实现平台差异化逻辑。FAQ部分提供了HMS API跨平台改造方案,包括动态import优化以避免crash问题,提升代码效率与整洁性。
130 44
|
1月前
|
API Android开发 开发者
ArkUI-X跨平台应用改造指南
随着HarmonyOS Next 5.0的发布,基于ArkTS开发的应用日益丰富,但也面临多平台适配的挑战。ArkUI-X框架提供“一次开发、三平台部署”解决方案,助力开发者高效实现跨平台应用。本文介绍如何通过ArkUI-X将HarmonyOS Next应用改造为支持Android与iOS的跨平台工程,涵盖产品定制层(products)、基础特性层(features)和公共能力层(commons)的设计与实现,优化代码复用与交互一致性。
140 52
|
1月前
|
容器
[HarmonyOS NEXT 实战案例:分割布局] 基础篇 - 垂直分割布局ColumnSplit详解
在HarmonyOS NEXT应用开发中,布局是构建用户界面的基础。垂直分割布局`ColumnSplit`是一种常用的布局方式,它可以将界面在垂直方向上分割成多个区域,每个区域可以包含不同的内容。本教程将详细讲解`ColumnSplit`组件的基本用法和特点,帮助你掌握这一重要的布局技术。
61 7
|
24天前
|
存储 JSON 编解码
ArkUI-X资源分类与访问
在应用开发中,资源管理至关重要。为了适配不同设备和配置,开发者可通过资源文件自定义颜色、字体、间距等资源,并利用系统预置资源确保视觉风格统一。资源分为应用资源和系统资源:应用资源存放在resources目录下,按base目录、限定词目录和rawfile目录分类管理;系统资源则提供跨设备一致的UI表现。通过$r引用方式,可灵活调用对应资源,提升应用兼容性与开发效率。
|
2月前
|
前端开发 API vr&ar
DevEco重大更新快来体验吧
HarmonyOS API 17正式发布,DevEco新增多项特性。支持创建API 17应用,模拟器首次适配阔折叠手机与2in1设备。新增权限管理功能,可自动签名快速申请ACL权限;新增自动监听WebView进程能力,简化调试流程。系统能力方面,支持指定窗口大小、AR Engine深度估计、ArkUI对2in1设备优化及新增File Manager Service Kit文件管理服务,大幅提升开发效率与用户体验。
175 64
DevEco重大更新快来体验吧
|
1月前
|
开发工具 Android开发
ArkUI-X添加到现有Android项目中
本教程介绍如何使用ArkUI-X SDK开发Android AAR,实现ArkTS声明式开发在Android平台的显示。主要内容包括:1) 跨平台Library工程开发;2) AAR在Android应用中的集成方式。通过ACE Tools或DevEco Studio完成AAR构建,初始化ArkUI-X,并通过Activity或Fragment加载页面。具体步骤涵盖工程创建、构建AAR包、配置Manifest及使用Intent或Fragment打开页面等。
133 57
|
28天前
|
开发框架 开发工具 Android开发
ArkUI-X应用工程结构说明
本文档介绍了ArkUI-X的跨平台开发框架,扩展OpenHarmony ArkUI至Android和iOS平台。开发者可复用大部分UI与逻辑代码,降低跨平台开发成本。文档详细说明了应用工程目录结构,包括跨平台模块配置(`arkui-x-config.json5`)以及ArkTS、ArkUI资源的编译构建流程。在Android平台上,资源通过`assets`管理;在iOS平台上,资源通过`Bundle Resources`管理。此外,还展示了Android与iOS应用工程的具体结构,涵盖编译后的字节码文件、资源文件及框架动态库等内容。