新闻详情

新闻详情

首页 / 资讯中心 / 详情

【共创季稿事节】HarmonyOS7 互动卡片开发实践:从 0 看懂 LiveCard 项目的主链路

发布时间:2026/9/1 12:57:00来源:尧图网络
【共创季稿事节】HarmonyOS7 互动卡片开发实践:从 0 看懂 LiveCard 项目的主链路
文章目录效果图状态切换反馈音乐卡片播放与切歌反馈快递卡片传感器驱动反馈你先打开这几个文件第一步主页负责添加卡片第二步module.json5 注册能力第三步form_config.json 把两边绑起来第四步EntryFormAbility 管生命周期第五步普通卡片发起互动区第六步requestOverflow 真正打开互动区小白排查顺序写在最后如果你第一次看这个项目千万别一上来就改MusicLiveCard.ets或DeliveryLiveCard.ets。互动卡片不是一个单页面功能它更像一条接力赛主页添加卡片普通卡片显示在桌面普通卡片发消息EntryFormAbility接消息系统再拉起 LiveForm。这篇先不追动画细节只把主链路讲透。小白把这一篇看明白后面的音乐、运动、快递、睡眠四类卡片就都能顺着读下去了。效果图先看一眼最终效果。这里不把所有动效硬塞成一坨而是按场景拆开看音乐、运动、快递、睡眠各有自己的互动重点后面的文章也会按这个顺序逐个拆。状态切换反馈音乐卡片播放与切歌反馈快递卡片传感器驱动反馈效果是不是很漂亮接下来先不急着写动画我们先把这条互动卡片主链路跑明白。你先打开这几个文件建议按这个顺序看entry/src/main/ets/pages/Index.etsentry/src/main/module.json5entry/src/main/resources/base/profile/form_config.jsonentry/src/main/ets/entryformability/EntryFormAbility.etsentry/src/main/ets/utils/ActionUtils.etsentry/src/main/ets/livecardability/MusicLiveCardAbility.etsentry/src/main/ets/livecardability/pages/MusicLiveCard.ets这几个文件正好对应一条完整链路。Index.ets 添加卡片 - form_config.json 找到普通卡片 - EntryFormAbility.onAddForm 保存卡片实例 - widget/pages/*.ets 显示桌面卡片 - ActionUtils 发送点击动作 - EntryFormAbility.onFormEvent 接收 requestOverflow - formProvider.requestOverflow 请求展开互动区 - LiveCardAbility.onLiveFormCreate 加载 LiveForm 页面第一步主页负责添加卡片Index.ets里最关键的是openFormManager()。constwant:Want{bundleName:BuildProfile.BUNDLE_NAME,abilityName:EntryFormAbility,parameters:{ohos.extra.param.key.form_dimension:config.cardDimension,ohos.extra.param.key.form_name:config.cardName,ohos.extra.param.key.module_name:MODULE_NAME,ohos.extra.param.key.form_location:0}};formProvider.openFormManager(want);这段代码的意思是告诉系统“我要添加一张卡片这张卡片归EntryFormAbility管”。小白重点看parametersform_dimension卡片尺寸比如2*2、2*4。form_name卡片名比如MusicCard、DeliveryCard。module_name当前模块名项目里是livecardsample。如果这些参数传错后面的EntryFormAbility.onAddForm()就拿不到正确卡片信息。第二步module.json5 注册能力module.json5是能力注册表。互动卡片至少需要两类能力{ name: EntryFormAbility, srcEntry: ./ets/entryformability/EntryFormAbility.ets, type: form }这个是普通卡片扩展入口。{ name: MusicLiveCardAbility, srcEntry: ./ets/livecardability/MusicLiveCardAbility.ets, type: liveForm }这个是互动区域入口。注意type。普通卡片是form互动卡片是liveForm。这两个写反功能就跑不起来。第三步form_config.json 把两边绑起来普通卡片和 LiveForm 的绑定关系在form_config.json{name:MusicCard,src:./ets/widget/pages/MusicCard.ets,defaultDimension:2*4,supportDimensions:[2*4],sceneAnimationParams:{abilityName:MusicLiveCardAbility}}这里最容易混的是src和abilityName。src指普通桌面卡片页面。比如音乐卡片就是widget/pages/MusicCard.ets。sceneAnimationParams.abilityName指 LiveForm 能力。比如音乐卡片展开后由MusicLiveCardAbility负责加载互动页。第四步EntryFormAbility 管生命周期EntryFormAbility.ets是普通卡片的管家。onAddForm(want:Want):formBindingData.FormBindingData{letformIdwant.parameters?.[ohos.extra.param.key.form_identity]asstring;letformNamewant.parameters?.[ohos.extra.param.key.form_name]asstring;letformDimensionwant.parameters?.[ohos.extra.param.key.form_dimension]asstring;letformInfonewFormInfo();formInfo.formIdformId;formInfo.formNameformName;formInfo.formDimensionformDimension;FormUtils.insertFormData(this.context,formInfo);returnformBindingData.createFormBindingData({formId});}这段代码做了三件事从系统want里拿到卡片 ID、名称、尺寸。通过FormUtils.insertFormData()保存到数据库。返回初始化数据给普通卡片。为什么要保存formId因为后面调用formProvider.updateForm(formId, data)时必须知道更新哪一张卡片。第五步普通卡片发起互动区以音乐卡片为例用户点击播放时会调用ActionUtils.requestOverFlowWithAction(this,LiveCardScale.MUSIC_WIDTH,LiveCardScale.MUSIC_HEIGHT,LIVE_CARD_DURATION,PLAY,this.songId);ActionUtils里最终会发postCardActionpostCardAction(component,{action:FormCarAction.MESSAGE,abilityName:ENTRY_FORM_ABILITY,params:{message:requestOverflow,widthRatio,heightRatio,duration}});这里的MESSAGE会送到EntryFormAbility.onFormEvent()。第六步requestOverflow 真正打开互动区EntryFormAbility收到requestOverflow后会调用项目里的私有方法privateasyncrequestOverflow(formId:string,widthRatio:number,heightRatio:number,duration:number):Promisevoid{letformRect:formInfo.RectawaitformProvider.getFormRect(formId);letcardWidthformRect.width*widthRatio;letcardHeightformRect.height*heightRatio;letleftOffset(formRect.width-cardWidth)/2;lettopOffset(formRect.height-cardHeight)/2;formProvider.requestOverflow(formId,{area:{left:leftOffset,top:topOffset,width:cardWidth,height:cardHeight},duration});}这就是互动卡片展开的核心。它不是简单“打开一个页面”而是在当前桌面卡片周围申请一个溢出区域。这个区域多大由widthRatio和heightRatio决定。小白排查顺序如果互动区打不开别乱改 UI。按这个顺序查module.json5里有没有EntryFormAbility类型是不是form。module.json5里有没有对应 LiveForm类型是不是liveForm。form_config.json的sceneAnimationParams.abilityName是否和 LiveForm 名称一致。普通卡片点击后ActionUtils.requestOverFlow()有没有执行。EntryFormAbility.onFormEvent()有没有收到requestOverflow。formProvider.requestOverflow()有没有报错。写在最后互动卡片开发最怕“只看一个文件”。这个项目是多文件协作配置、普通卡片、Ability、工具类、LiveForm 页面缺一不可。记住这条线添加卡片 - 保存 formId - 普通卡片发消息 - FormAbility 请求溢出 - LiveForm 加载页面后面所有教程都是在这条主链路上继续加业务。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

导航工程实习全流程解析:GNSS控制网与RTK放样实战 2026/9/1 13:50:49

导航工程实习全流程解析:GNSS控制网与RTK放样实战

简介:武汉大学测绘学院19级导航工程第三学期专业实习的完整资料包,面向测绘、卫星导航相关专业学生,也适合需要学习卫星导航数据质量分析的开发者。实习内容围绕卫星导航接收机观测数据展开,配套C#语言自编程序可实现数据利用率统…

阅读更多 →
奇安信运维工程师笔试复盘:安全厂商的运维考什么? 2026/9/1 13:50:49

奇安信运维工程师笔试复盘:安全厂商的运维考什么?

2020年秋招,我投的是奇安信运维工程师。说实话,点开笔试链接之前,我心里对这家公司的试卷是有预期的——毕竟是安全公司,考的大概率是渗透、Web漏洞、攻防那一套。结果题目刷下来才发现,自己只猜对了一半:卷…

阅读更多 →
系统“帅不过三秒”现象解析:冷启动、峰值压力与稳定性排查指南 2026/9/1 13:50:49

系统“帅不过三秒”现象解析:冷启动、峰值压力与稳定性排查指南

“肺雾正男帅不过三秒”这类表达,在技术人之间早就不是单纯的网络梗。它描述的是一个非常熟悉的场面:某个服务或者某场演示,开场时响应很快、页面正常、数据正确,看起来一切都很优雅,但三秒钟之后,接口开始…

阅读更多 →
如何设计数小时专注?从注意力管理到编程音乐 2026/9/1 13:50:49

如何设计数小时专注?从注意力管理到编程音乐

“黑客如何保持数小时专注?”——每次看到类似标题,我都有点想点进去,但看完又总觉得缺了点什么。缺的是:它把专注描述成了一种近乎超自然的天赋,而忽略了背后真正可复制的部分。 在流行叙事里,黑客好像永…

阅读更多 →
好未来基础平台研发岗秋招笔试复盘:操作系统、网络与编程题全解析 2026/9/1 13:50:49

好未来基础平台研发岗秋招笔试复盘:操作系统、网络与编程题全解析

2023年秋天我参加了好未来的秋招笔试,投的是基础平台研发岗。当时整个流程走得挺紧凑,笔试安排在简历筛选之后,线上统一进行,时间大概两个小时。那段时间我前后参加了不少公司的笔试,好未来这套题给我留下的印象很深刻…

阅读更多 →
3 步完成零样本语音克隆:让 AI 免费商用你的声音 2026/9/1 13:47:47

3 步完成零样本语音克隆:让 AI 免费商用你的声音

3 步完成零样本语音克隆:让 AI 免费商用你的声音 【免费下载链接】OpenVoice Instant voice cloning by MIT and MyShell. Audio foundation model. 项目地址: https://gitcode.com/GitHub_Trending/op/OpenVoice 你只有一段十几秒的录音,OpenVoi…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞