当前位置: 首页 > news >正文

鸿蒙Next ArkTS卡片提供方开发指南:从入门到实战

一次开发多端部署的组件化UI开发精髓

在鸿蒙生态中,服务卡片(Service Widget)是一种强大的界面展示形式,能够将应用的重要信息或操作前置到卡片,达到服务直达、减少体验层级的目的。而ArkTS作为鸿蒙主推的声明式开发语言,为卡片开发带来了全新的开发体验和效率提升。

本文将全面介绍鸿蒙Next ArkTS卡片开发的方方面面,从基础概念到实战应用,帮助你快速掌握卡片提供方的开发技能。

一、ArkTS卡片概述

什么是ArkTS卡片?

ArkTS卡片是基于声明式开发范式开发的服务卡片,可以将应用内的重要信息或操作前置展示。与其他类型的卡片相比,ArkTS卡片具备更强大的动效能力自定义绘制能力逻辑代码执行能力

静态卡片 vs 动态卡片

ArkTS卡片分为两种类型,它们有不同的特点和适用场景:

特性静态卡片动态卡片
支持能力仅支持UI组件和布局能力支持UI组件、布局、通用事件和自定义动效能力
适用场景展示静态信息(UI相对固定)有复杂业务逻辑和交互的场景
优缺点功能简单但有效控制内存开销功能丰富但内存开销较大
交互能力仅可通过FormLink组件跳转到指定UIAbility支持router、message和call三种类型的事件

ArkTS卡片的优势

ArkTS卡片相较于JS卡片具备如下几点优势:

  1. 统一开发范式:统一了卡片和页面的开发范式,页面的布局可以直接复用到卡片布局中,提升开发体验和开发效率。

  2. 增强了卡片的能力:新增了动效的能力、自定义绘制的能力,允许卡片中运行逻辑代码。

  3. 更高效的性能:通过声明式UI和状态管理,提供了更高效的渲染性能。

二、开发环境搭建与项目创建

创建ArkTS卡片项目

在DevEco Studio中创建ArkTS卡片有两种方式:

  1. 创建工程时选择Application或Atomic Service(元服务)

  2. 在已有工程中通过右键新建卡片

具体操作路径:右键点击项目 → New → Service Widget → 选择ArkTS作为开发语言 → 选择卡片模板和规格。

工程结构分析

创建完成后,工程中会新增以下卡片相关文件:

  • EntryFormAbility.ets:卡片生命周期管理文件,负责处理卡片的创建、销毁和刷新

  • WidgetCard.ets:卡片页面文件,包含UI布局和交互逻辑

  • form_config.json:卡片配置文件,定义卡片的基本信息和特性

三、卡片生命周期管理

ArkTS卡片通过FormExtensionAbility类管理生命周期,需要实现以下关键回调方法:

typescript

import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';
import formBindingData from '@ohos.app.form.formBindingData';export default class EntryFormAbility extends FormExtensionAbility {// 创建卡片时调用onAddForm(want) {console.info('[EntryFormAbility] onAddForm');let obj = {"title": "titleOnCreate","detail": "detailOnCreate"};let formData = formBindingData.createFormBindingData(obj);return formData;}// 更新卡片时调用onUpdateForm(formId) {console.info('[EntryFormAbility] onUpdateForm');let obj = {"title": "titleOnUpdate","detail": "detailOnUpdate"};let formData = formBindingData.createFormBindingData(obj);formProvider.updateForm(formId, formData).catch(error => {console.info('[EntryFormAbility] updateForm, error:' + JSON.stringify(error));});}// 销毁卡片时调用onRemoveForm(formId) {console.info('[EntryFormAbility] onRemoveForm');}// 其他生命周期方法...
}

四、卡片配置文件详解

卡片的配置文件在entry/src/main/resources/base/profile/form_config.json路径。以下是一个典型的配置示例:

json

{"forms": [{"name": "widget","displayName": "$string:widget_display_name","description": "$string:widget_desc","src": "./ets/widget/pages/WidgetCard.ets","uiSyntax": "arkts","window": {"designWidth": 720,"autoDesignWidth": true},"colorMode": "auto","isDynamic": true,"isDefault": true,"updateEnabled": false,"scheduledUpdateTime": "10:30","updateDuration": 1,"defaultDimension": "2*2","supportDimensions": ["2*2"]}]
}

关键配置项说明

  • name:卡片的名称,字符串最大长度为127字节

  • displayName:卡片的显示名称,支持多语言

  • src:卡片对应的UI代码的完整路径

  • isDynamic:是否为动态卡片(仅针对ArkTS卡片生效)

  • updateEnabled:是否支持周期性刷新

  • supportDimensions:卡片支持的外观规格

  • defaultDimension:卡片的默认外观规格

五、实战:创建一个可复用的信息卡片组件

下面我们通过一个实际案例,创建一个可复用的信息卡片组件。

组件定义与参数配置

typescript

@Component
export struct InfoCard {// 支持标题、副标题展示@Prop title: string;@Prop subtitle: string;// 可自定义图标@Prop icon: string;// 可响应点击事件@Prop onTap: () => void;build() {Row() {// 图标部分Text(this.icon).fontSize(20).margin({ right: 10 })// 文字信息部分Column() {Text(this.title).fontSize(16).fontWeight(FontWeight.Bold).textOverflow({ overflow: TextOverflow.Ellipsis })Text(this.subtitle).fontSize(14).opacity(0.6)}.alignItems(HorizontalAlign.Start).layoutWeight(1)}.padding(12).backgroundColor(Color.White).borderRadius(8).shadow({ radius: 4, color: '#1A000000', offsetX: 0, offsetY: 2 }).onClick(() => {if (this.onTap) {this.onTap();}})}
}

在主页面中使用组件

typescript

@Entry
@Component
struct Index {build() {Column() {InfoCard({icon: '📦',title: '今日订单',subtitle: '已完成:123单',onTap: () => {console.log('点击了订单卡片');// 这里可以添加跳转逻辑}})InfoCard({icon: '💰',title: '本月收入',subtitle: '¥18,250',onTap: () => {console.log('点击了收入卡片');// 这里可以添加跳转逻辑}})}.width('100%').alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.Center).height('100%').backgroundColor('#ffffff')}
}

六、动态数据与ForEach渲染

对于需要显示列表数据的卡片,可以使用ForEach组件实现数据驱动渲染:

typescript

ForEach(dataSource,       // 数据源,通常是数组itemGenerator,     // 项目生成器,定义如何将数据项转换为UI组件keyGenerator       // 键生成器,为每个项目生成唯一标识符
)

动态高度卡片列表示例

typescript

private cardData: string[] = ['科技新闻', '热点事件', '财经分析', '娱乐资讯', '体育快报']ForEach(this.cardData, (item:string) => {Row() {Text(item).fontSize(14).lineHeight(1.5)}.width('48%').height(item.includes('热点') ? 120 : 80) // 模拟不同高度卡片.margin(4).padding(12).shadow({ radius: 4, color: 0x05000000 })
}, (item: string) => item)

七、卡片动效与交互

ArkTS卡片支持丰富的动画效果,以下是一个按钮旋转动画示例:

typescript

@Entry
@Component
struct AttrAnimationExample {@State rotateAngle: number = 0;build() {Column() {Button('change rotate angle').onClick(() => {this.rotateAngle = 90;}).margin(50).rotate({ angle: this.rotateAngle }).animation({curve: Curve.EaseOut,playMode: PlayMode.AlternateReverse})}.width('100%').margin({ top: 20 })}
}

需要注意的是,ArkTS卡片使用动画效果时具有以下限制:

名称参数说明限制描述
duration动画播放时长限制最长的动效播放时长为1秒
tempo动画播放速度卡片中禁止设置此参数,使用默认值1
delay动画延迟执行的时长卡片中禁止设置此参数,使用默认值0
iterations动画播放次数卡片中禁止设置此参数,使用默认值1

八、卡片数据持久化与更新

卡片的数据通常需要进行持久化存储,并在适当时机更新:

typescript

import dataStorage from '@ohos.data.storage';// 获取存储实例
const storage = await dataStorage.getStorage(this.context, 'CardData');// 存储数据
await storage.put('key', 'value');
await storage.flush();// 读取数据
const value = await storage.get('key', 'defaultValue');

定时更新卡片

通过在form_config.json中配置更新参数,可以实现卡片的定时更新:

json

{"updateEnabled": true,"scheduledUpdateTime": "10:30","updateDuration": 1
}

也可以代码中设置下一次刷新时间:

typescript

// 设置5分钟后刷新
formProvider.setFormNextRefreshTime(formId, 5, (error) => {if (error) {console.error(`setFormNextRefreshTime failed, error: ${JSON.stringify(error)}`);}
});

九、常见场景与实战案例

案例1:金融账单卡片(动态数据)

typescript

@Entry
@Component
struct BillCard {@State billData: BillItem[] = []; // 数据状态绑定build() {Grid() {ForEach(this.billData, (item) => { // 动态渲染GridItem() {Text(item.amount).fontSize(16)Text(item.date).fontColor(Color.Gray)}})}.onAppear(() => this.fetchData()) // 生命周期触发}private fetchData() {// 分布式数据管理获取跨端数据const kvStore = new DistributedKVStore(this.context);kvStore.getData('bill_data').then(data => this.billData = data);}
}

案例2:服务跳转卡片(Router事件)

typescript

Button('功能A').onClick(() => {postCardAction(this, {'action': 'router','abilityName': 'EntryAbility', // 目标UIAbility'params': { 'targetPage': 'funA' } // 传递参数})
})

案例3:媒体控制卡片(动态样式)

typescript

@Entry
@Component
struct MediaCard {@State isPlaying: boolean = false;build() {Column() {Image(this.isPlaying ? "/common/pause.png" : "/common/play.png").onClick(() => {// 调用媒体服务控制播放avPlayer.togglePlayback();this.isPlaying = !this.isPlaying;})}.backgroundBlur(10) // 背景模糊特效}
}

十、避坑指南与最佳实践

  1. 性能优化:避免在卡片中执行复杂计算操作,尽量减少卡片刷新频率

  2. 兼容性处理:为不同尺寸的卡片提供不同的布局

    json

    "forms": [{ "name": "small_widget", "description": "2x2卡片", "src": "/widget/small/index" }
    ]
  3. 动态能力限制:注意ArkTS卡片仅支持声明式范式的部分组件、事件、动效、数据管理、状态管理和API能力

  4. 调试技巧:由于ArkTS卡片暂不支持断点调试能力和Hot Reload热重载,需要依赖日志进行调试

总结

ArkTS卡片作为鸿蒙生态中"原子化服务"的核心载体,通过其动态能力与分布式架构,正在重新定义服务触达方式。通过本文的介绍,你应该已经掌握了ArkTS卡片开发的核心概念和技能。

关键要点回顾

  1. ArkTS卡片提供了比JS卡片更强大的能力和统一的开发体验

  2. 卡片生命周期通过FormExtensionAbility类管理

  3. 使用声明式UI范式构建卡片界面,支持动态数据和交互

  4. 通过合理的配置实现卡片的定时更新和数据持久化

  5. 注意ArkTS卡片的能力限制和性能优化

希望本篇博客能帮助你快速入门鸿蒙Next ArkTS卡片开发,并在实际项目中灵活运用这些知识,构建出体验优良的服务卡片。

http://www.dtcms.com/a/394071.html

相关文章:

  • Netty LengthFieldBasedFrameDecoder
  • 后端_HTTP 接口签名防篡改实战指南
  • 区块链论文速读 CCF A--WWW 2025(5)
  • 机器学习周报十四
  • 如何解决stun服务无法打洞建立p2p连接的问题
  • 解决项目实践中 java.lang.NoSuchMethodError:的问题
  • JavaSE-多线程(5.2)- ReentrantLock (源码解析,公平模式)
  • 2025华为杯A题B题C题D题E题F题选题建议思路数学建模研研究生数学建模思路代码文章成品
  • 【记录】Docker|Docker中git克隆私有库的安全方法
  • Web之防XSS(跨站脚本攻击)
  • 使用 AI 对 QT应用程序进行翻译
  • Windows下游戏闪退?软件崩溃?游戏环境缺失?软件运行缺少依赖?这个免费工具一键帮您自动修复(DLL文件/DirectX/运行库等问题一键搞定)
  • 【从入门到精通Spring Cloud】统一服务入口Spring Cloud Gateway
  • setfacl 命令
  • Photoshop - Photoshop 分享作品和设计
  • 【Agent 设计模式与工程化】如何做出好一个可持续发展的agent需要考虑的架构
  • 【Camera开发】疑难杂症记录
  • 如何提高自己的Java并发编程能力?
  • Polkadot - ELVES Protocol详解
  • springBoot图片本地存储
  • 蝉镜-AI数字人视频创作平台
  • Linux入门(五)
  • MySqL-day4_03(索引)
  • Vue 深度选择器(:deep)完全指北:从“能用”到“用好”
  • [Nodejs+LangChain+Ollama] 1.第一个案例
  • 设计模式2.【备忘录模式】
  • Spring Boot 入门:快速构建现代 Java 应用的利器
  • Redis 实例 CPU 飙高到 90%,如何排查和解决?
  • 中国女篮备战全运会,宫鲁鸣重点培养年轻核心
  • 【Qt】常用控件1——QWidget