【共创季稿事节】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 加载页面后面所有教程都是在这条主链路上继续加业务。

相关新闻

WinBtrfs:在Windows平台上原生支持Btrfs文件系统的完整解决方案

WinBtrfs:在Windows平台上原生支持Btrfs文件系统的完整解决方案

WinBtrfs:在Windows平台上原生支持Btrfs文件系统的完整解决方案 【免费下载链接】btrfs WinBtrfs - an open-source btrfs driver for Windows 项目地址: https://gitcode.com/gh_mirrors/bt/btrfs WinBtrfs是一个为Windows系统开发的开源Btrfs驱动程序&…

2026/6/19 3:40:19阅读更多 →
(良心整理)实测好用的AI论文写作软件,毕业党收藏备用

(良心整理)实测好用的AI论文写作软件,毕业党收藏备用

毕业季论文写作真的这么难吗?选题卡壳、文献翻不完、逻辑理不清、查重反复改、格式总不对…… 这份精心整理的AI论文工具清单,覆盖中英文写作、全流程辅助与专项功能,免费和高性价比工具都有,从开题到定稿全程护航,毕业…

2026/6/19 3:40:19阅读更多 →
终极指南:3种创新方法解决小爱音箱音乐服务DID配置难题

终极指南:3种创新方法解决小爱音箱音乐服务DID配置难题

终极指南:3种创新方法解决小爱音箱音乐服务DID配置难题 【免费下载链接】xiaomusic 使用小爱音箱播放音乐,音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 小爱音箱音乐服务(xiaomusic&#xf…

2026/6/19 3:35:18阅读更多 →
Selenium元素定位终极指南:8种方法、实战技巧与避坑策略

Selenium元素定位终极指南:8种方法、实战技巧与避坑策略

1. 项目概述:为什么元素定位是自动化测试的“命门”?干了这么多年自动化测试,我敢说,超过80%的自动化脚本失败,问题都出在元素定位上。你兴冲冲地写好了脚本,一运行,浏览器是打开了,…

2026/6/19 5:10:23阅读更多 →
Kimi-K2.5原生多模态架构:ViT-MLP-LLM协同进化与Agent并行推理

Kimi-K2.5原生多模态架构:ViT-MLP-LLM协同进化与Agent并行推理

1. 项目概述:当多模态理解不再“看图说话”,Agent协作也不再是单线程排队我做多模态大模型(MLLM)落地项目快六年了,从最早的CLIPLLM拼接方案,到后来Qwen-VL、InternVL系列的端到端训练,再到最近…

2026/6/19 5:10:23阅读更多 →
聚焦AI时代反网络钓鱼,筑牢跨境通信安全防线——“一带一路”国家网络安全人才技能培训班成功举办

聚焦AI时代反网络钓鱼,筑牢跨境通信安全防线——“一带一路”国家网络安全人才技能培训班成功举办

6月6日,“一带一路”国家网络安全人才技能培训班在广州大学城智汇谷成功举办。本次培训由公共互联网反网络钓鱼工作组成员单位广东盈世计算机科技有限公司(Coremail)、暨南大学共同主办,来自30余个“一带一路”国家的60名外籍学员…

2026/6/19 5:10:23阅读更多 →
MCP1525与MCP1541电压基准芯片:选型、电路设计与高频问题排查指南

MCP1525与MCP1541电压基准芯片:选型、电路设计与高频问题排查指南

1. 项目概述:为什么电压基准芯片是精密电路的“定盘星”?在模拟电路设计里,尤其是涉及数据采集、电源管理或者精密测量的场合,我们常常会听到一个词——“基准”。这个基准,很多时候指的就是一个稳定、精确的电压参考点…

2026/6/19 5:10:23阅读更多 →
嵌入式开发中链接器参数文件(PRM)的内存配置与优化实践

嵌入式开发中链接器参数文件(PRM)的内存配置与优化实践

1. 项目概述:嵌入式开发中的内存“总规划师”——链接器参数文件(PRM)在嵌入式MCU开发的世界里,我们写的C代码、汇编指令、全局变量,最终都要在芯片那有限的、物理的、实实在在的内存空间里找到自己的“家”。这个“安…

2026/6/19 5:10:23阅读更多 →
ai首饰模特生成新体验,场景创作与效果提升全面解读

ai首饰模特生成新体验,场景创作与效果提升全面解读

在当前电商和内容行业加速升级的大背景下,ai首饰模特类智能生成工具已成为商家、设计师与内容创作者提升效率与视觉竞争力的新选择。本文将结合多款主流AI图片生成平台的实际表现,为大家详解ai首饰模特自动生成在电商、社交与设计等多场景下的潜力与落地…

2026/6/19 5:05:23阅读更多 →
Photobucket付费墙背后:5美元买童年回忆却落得一场空!

Photobucket付费墙背后:5美元买童年回忆却落得一场空!

1. 付费墙初现如今身处万亿市值公司林立的时代,我们也不能轻易放弃5美元。就像Photobucket,它曾相当于过去的Imgur,我们小时候常把图片上传到这个网站,然后在各种论坛上分享链接,它简单好用,尽职尽责。但最…

2026/6/19 0:04:37阅读更多 →
如何在5分钟内掌握Mermaid Live Editor:实时图表编辑终极指南

如何在5分钟内掌握Mermaid Live Editor:实时图表编辑终极指南

如何在5分钟内掌握Mermaid Live Editor:实时图表编辑终极指南 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live…

2026/6/19 0:04:37阅读更多 →
yuzu模拟器内存修改技术深度解析:金手指功能实现原理与实践指南

yuzu模拟器内存修改技术深度解析:金手指功能实现原理与实践指南

yuzu模拟器内存修改技术深度解析:金手指功能实现原理与实践指南 【免费下载链接】yuzu 项目地址: https://gitcode.com/GitHub_Trending/yuz/yuzu yuzu作为目前最流行的开源Nintendo Switch模拟器,不仅提供了完整的游戏运行环境,还内…

2026/6/19 0:04:37阅读更多 →