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框架使用平台原生接口方法,使用时需满足相应的原生系统版本要求。

原创作者: zhaloe 转载于: https://www.cnblogs.com/zhaloe/p/18945155
<think>好的,用户现在想要查找ArkUI-X的示例代码或使用案例。我需要结合之前的对话和提供的引用内容来给出回答。 首先,用户之前已经询问过ArkUI-X的技术文档和资源,我给出了官方文档入口、核心功能、快速开始示例和开发工具要求。现在用户进一步需要具体的案例或示例,这可能是因为他们想通过实际代码来学习如何使用ArkUI-X。 接下来,我需要查看用户提供的引用内容。引用1提到了编译命令,引用2是SDK结构,引用3是iOS的初始化代码,引用4提到了购物车案例中的MVVM模式,引用5展示了平台差异化的处理。这些引用中,引用4和5直接提到了具体的代码示例,尤其是购物车案例和平台差异化处理。此外,用户之前的回答里有一个TypeScript的快速开始示例,可能也需要再次提及。 用户可能希望看到不同方面的示例,比如UI组件、跨平台处理、数据绑定等。根据引用4,购物车案例使用了@ObjectLink和@Observed装饰器,这可以用来展示MVVM模式。引用5的平台差异化示例可以用来演示如何处理不同平台的逻辑。此外,用户之前的回答中的快速开始示例可以再次展示,作为基础组件的例子。 需要确保回答结构清晰,分点列出不同的示例,并附上代码块。同时,根据用户要求,使用中文,行内公式用$...$,独立公式用$$...$$,但这里可能不太需要公式,重点在代码示例。另外,每个引用的末尾要添加引用标识,比如[^4]。 还需要生成相关问题,可能涉及如何获取更多案例、跨平台处理的最佳实践、数据绑定的实现方法等。确保问题与用户的需求相关,帮助他们进一步探索。 总结回答结构: 1. 基础组件示例(之前回答中的Hello World) 2. MVVM购物车案例(引用4) 3. 平台差异化处理(引用5) 4. iOS集成示例(引用3) 5. 如何获取更多案例(官方资源) 然后,相关问题部分提出三个问题,引导用户深入。 需要检查所有代码示例是否正确,引用标注是否准确,并确保语言流畅自然。</think>根据ArkUI-X的技术文档和开发实践,以下是典型应用案例及代码示例整理: ### 一、基础组件开发示例 ```typescript // 跨平台按钮组件(支持HarmonyOS/Android/iOS) @Component struct CrossPlatformButton { @State clickCount: number = 0 build() { Button(`点击次数: ${this.clickCount}`) .width(200) .height(50) .backgroundColor('#409EFF') .onClick(() => { this.clickCount++ }) } } ``` 该组件实现跨平台点击计数功能,通过声明式UI自动适配各平台原生控件[^1]。 ### 二、MVVM模式购物车案例 ```typescript // 商品数据模型 @Observed class Product { name: string price: number @Track quantity: number constructor(name: string, price: number) { this.name = name this.price = price this.quantity = 0 } } // 购物车组件 @Component struct ShoppingCart { @ObjectLink selectedProducts: Product[] build() { List({ space: 10 }) { ForEach(this.selectedProducts, (item: Product) => { ListItem() { Text(`${item.name} x${item.quantity}`) .fontSize(18) Button('+') .onClick(() => item.quantity++) } }) } } } ``` 该案例展示@Observed与@ObjectLink实现双向数据绑定[^4]。 ### 三、跨平台差异处理 ```typescript // 平台特定功能适配 @Component struct DeviceInfoExample { @State osName: string = deviceInfo.osFullName build() { Column() { Text(`当前系统: ${this.osName}`) if (this.osName.startsWith('Android')) { AndroidSpecificComponent() } else if (this.osName.includes('iOS')) { IOSSpecificComponent() } } } } ``` 通过deviceInfo接口实现平台逻辑分支[^5]。 ### 四、iOS平台集成示例 ```objective-c // iOS原生集成ArkUI-X模块 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options { // 初始化ArkUI-X引擎 [StageApplication configModuleWithBundleDirectory:@"arkui-x"]; [StageApplication launchApplication]; // 加载ArkUI组件 ArkUIViewController *arkuiVC = [[ArkUIViewController alloc] init]; [self.navigationController pushViewController:arkuiVC animated:YES]; return YES; } ``` 展示iOS平台混合开发集成方式[^3]。 ### 五、官方示例资源 1. GitHub代码仓库:[ArkUI-X Samples](https://github.com/arkui-x/samples) 2. 开发工具模板:DevEco Studio新建项目时选择"Cross-Platform Application" 3. 文档中心:[组件案例库](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/arkui-x-samples-0000001632579613)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值