ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

HarmonyOS 互动卡片实战进阶:配置详解与双触发机制全链路实践

HarmonyOS 互动卡片实战进阶:配置详解与双触发机制全链路实践 HarmonyOS 互动卡片实战进阶配置详解与双触发机制全链路实践前言在上一篇文章中我们系统介绍了互动卡片的概念原理、双态架构和基础 API。但概念终要落地——form_config.json中的sceneAnimationParams如何配置module.json5中如何声明LiveFormExtensionAbility点击触发和摇一摇触发两条路径的区别是什么requestOverflow破框区域如何计算本文将从配置文件详解、双 Ability 声明、两种触发机制到破框区域计算逐一拆解互动卡片的配置与触发全链路。一、form_config.json 配置详解1.1 完整配置结构form_config.json是互动卡片的核心配置文件定义了卡片的基本信息、尺寸、触发方式等{forms:[{name:DeliveryCard,displayName:$string:DeliveryCard,description:$string:DeliveryCardDes,src:./ets/widget/pages/DeliveryCard.ets,uiSyntax:arkts,isDynamic:true,defaultDimension:2*2,supportDimensions:[2*2],sceneAnimationParams:{abilityName:DeliveryLiveCardAbility,triggerTypes:[click,shake]}}]}1.2 关键字段说明字段必填类型说明name是string卡片名称卡片五元组之一displayName是string卡片显示名称description是string卡片描述src是string卡片 UI 页面路径uiSyntax是stringUI 语法固定为arktsisDynamic是boolean是否为动态卡片互动卡片必须为truedefaultDimension是string默认尺寸supportDimensions是string[]支持的尺寸列表sceneAnimationParams否object场景动效配置互动卡片关键字段1.3 sceneAnimationParams 详解字段必填类型说明abilityName是string激活时启动的LiveFormExtensionAbility名称triggerTypes否string[]触发动画方式支持click和shake重要提示sceneAnimationParams.abilityName必须和module.json5里LiveFormExtensionAbility的name一字不差否则触发时系统找不到目标。1.4 四种卡片的配置差异卡片triggerTypes说明睡眠卡片[click]仅点击触发快递卡片[click, shake]点击 摇一摇运动卡片[click]仅点击触发音乐卡片[click]仅点击触发二、module.json5 双 Ability 声明2.1 完整配置{ module: { name: entry, type: entry, mainElement: EntryAbility, deviceTypes: [phone, tablet], pages: $profile:main_pages, abilities: [ { name: EntryAbility, srcEntry: ./ets/entryability/EntryAbility.ets } ], extensionAbilities: [ { name: EntryFormAbility, srcEntry: ./ets/entryformability/EntryFormAbility.ets, type: form, metadata: [ { name: ohos.extension.form, resource: $profile:form_config } ] }, { name: DeliveryLiveCardAbility, srcEntry: ./ets/livecardability/DeliveryLiveCardAbility.ets, type: liveForm } ] } }2.2 双 Ability 对比维度FormExtensionAbilityLiveFormExtensionAbilitytypeformliveForm管理状态非激活态激活态生命周期onCreate→onUpdateForm→onDestroyonLiveFormCreate→onLiveFormDestroy渲染能力静态卡片 UI动态动画 UI传感器不支持支持陀螺仪等2.3 配置注意事项abilityName 必须一致form_config.json中sceneAnimationParams.abilityName的字符串必须与module.json5中extensionAbilities的name字段完全一致type 必须正确FormExtensionAbility的type是formLiveFormExtensionAbility的type是liveFormmetadata 必须配置FormExtensionAbility需要metadata指向form_config.json三、点击触发机制详解3.1 点击触发流程点击触发是互动卡片最常用的激活方式完整流程如下用户点击卡片 ↓ 卡片 UI 调用 postCardAction(MESSAGE) 发送 requestOverflow 消息 ↓ FormExtensionAbility.onFormEvent 接收消息 ↓ 解析消息参数widthRatio、heightRatio、duration ↓ 调用 formProvider.getFormRect 获取卡片位置尺寸 ↓ 计算破框区域area ↓ 调用 formProvider.requestOverflow 向系统申请破框 ↓ 系统创建 LiveFormExtensionAbility 实例 ↓ onLiveFormCreate → session.loadContent 加载动画 UI3.2 点击触发完整代码// 1. 卡片 UI 中发送消息// entry/src/main/ets/widget/pages/DeliveryCard.etsEntryComponentstruct DeliveryCard{build(){RelativeContainer(){// 卡片内容...}.width(100%).height(100%).onClick((){// 关键点击时发送 requestOverflow 消息ActionUtils.requestOverFlow(this,LiveCardScale.DELIVERY_WIDTH,// 宽度比例LiveCardScale.DELIVERY_HEIGHT,// 高度比例LIVE_CARD_DURATION// 动画时长);});}}// 2. ActionUtils.requestOverFlow 实现// entry/src/main/ets/utils/ActionUtils.etsexportclassActionUtils{staticrequestOverFlow(component:object,widthRatio:number,heightRatio:number,duration:number):void{constparams:Recordstring,Object{message:requestOverflow,widthRatio:widthRatio,heightRatio:heightRatio,duration:duration};postCardAction(component,{action:message,message:JSON.stringify(params)});}staticjumpAppPage(component:object,pageName:string):void{postCardAction(component,{action:router,abilityName:EntryAbility,params:{targetPage:pageName}});}}// 3. FormExtensionAbility 处理消息// entry/src/main/ets/entryformability/EntryFormAbility.etsasynconFormEvent(formId:string,message:string):Promisevoid{constparams:Recordstring,ObjectJSON.parse(message);constshortMessage:stringparams.messageasstring;if(shortMessagerequestOverflow){constwidthRatioparams.widthRatioasnumber;constheightRatioparams.heightRatioasnumber;constdurationparams.durationasnumber;awaitthis.requestOverflow(formId,widthRatio,heightRatio,duration);}}privateasyncrequestOverflow(formId:string,widthRatio:number,heightRatio:number,duration:number):Promisevoid{try{constformRectawaitformProvider.getFormRect(formId);constcardWidthformRect.width*widthRatio;constcardHeightformRect.height*heightRatio;constleftOffset(formRect.width-cardWidth)/2;consttopOffset(formRect.height-cardHeight)/2;awaitformProvider.requestOverflow(formId,{area:{left:leftOffset,top:topOffset,width:cardWidth,height:cardHeight},duration:duration});}catch(err){console.error(requestOverflow error:${JSON.stringify(err)});}}四、摇一摇触发机制详解4.1 摇一摇触发流程摇一摇触发是 HarmonyOS 7.0 新增的激活方式流程如下步骤操作说明1用户摇动设备系统识别摇一摇事件2查找triggerTypes含shake的卡片匹配支持的卡片3读取sceneAnimationParams.abilityName获取 LiveFormExtensionAbility 名称4触发FormExtensionAbility.onUpdateForm系统将摇一摇事件发送给卡片5调用requestOverflow请求激活FormExtensionAbility 中主动拉起6创建LiveFormExtensionAbility实例系统自动创建7调用onLiveFormCreate方法加载动画 UI4.2 摇一摇触发配置{sceneAnimationParams:{abilityName:DeliveryLiveCardAbility,triggerTypes:[click,shake]}}注意摇一摇激活互动卡片能力仅在 HarmonyOS 7.0 以上版本触发。7.0 以下系统不识别shake配置了也不生效。4.3 摇一摇触发实现// 在 FormExtensionAbility.onUpdateForm 中处理摇一摇事件asynconUpdateForm(formId:string):Promisevoid{// 摇一摇触发时系统自动调用此方法// 在此处调用 requestOverflow 激活互动卡片console.info(摇一摇触发激活卡片:${formId});awaitthis.requestOverflow(formId,1.0,1.0,5000);}五、破框区域计算5.1 破框原理破框Overflow是互动卡片的核心特性允许激活态的渲染区域超出原始卡片边界。破框区域通过requestOverflow的area参数指定interfaceOverflowInfo{area:{left:number;// 破框区域左上角 X 坐标相对卡片top:number;// 破框区域左上角 Y 坐标相对卡片width:number;// 破框区域宽度height:number;// 破框区域高度};duration:number;// 动画时长毫秒}5.2 破框区域计算/** * 计算破框区域 * param formRect 卡片原始位置和尺寸 * param expandRatio 扩展比例 1.0 表示破框放大 * returns 破框区域信息 */functioncalculateOverflowArea(formRect:formInfo.Rect,expandRatio:number):{left:number;top:number;width:number;height:number}{// 计算破框后的尺寸constexpandedWidthformRect.width*expandRatio;constexpandedHeightformRect.height*expandRatio;// 居中偏移破框区域中心与卡片中心对齐constleftOffset(formRect.width-expandedWidth)/2;consttopOffset(formRect.height-expandedHeight)/2;return{left:leftOffset,top:topOffset,width:expandedWidth,height:expandedHeight};}5.3 不同卡片的破框参数卡片宽度比例高度比例动画时长说明睡眠卡片1.51.55000ms气球飘出边界需要较大扩展空间快递卡片1.31.35000ms憨憨跑动路线中等扩展运动卡片1.41.45000ms庆祝动画需要较大空间音乐卡片1.21.24000ms专辑飞出较小扩展六、常见配置错误与排查6.1 常见配置错误错误原因解决方案激活无响应abilityName拼写不一致确保form_config.json和module.json5中名称完全一致摇一摇不触发系统版本 7.0升级到 HarmonyOS 7.0破框区域不对计算错误检查getFormRect返回值确保居中计算正确动画白屏loadContent路径错误检查livecardability/pages/路径是否正确卡片类型错误isDynamic未设置为true动态卡片必须设置isDynamic: true6.2 配置检查清单/** * 互动卡片配置检查清单 */exportclassLiveFormConfigChecker{staticcheckConfig(formConfig:object,moduleConfig:object):CheckResult{consterrors:string[][];constwarnings:string[][];// 1. 检查 isDynamicif(!formConfig[isDynamic]){errors.push(isDynamic 必须为 true);}// 2. 检查 sceneAnimationParamsconstsceneParamsformConfig[sceneAnimationParams];if(!sceneParams||!sceneParams[abilityName]){errors.push(sceneAnimationParams.abilityName 未配置);}// 3. 检查 module.json5 中的 LiveFormExtensionAbilityconstextAbilitiesmoduleConfig[extensionAbilities]||[];constliveFormAbilityextAbilities.find((a:Recordstring,string)a[type]liveForm);if(!liveFormAbility){errors.push(module.json5 中未声明 type 为 liveForm 的 extensionAbility);}// 4. 检查 abilityName 一致性if(sceneParamsliveFormAbility){if(sceneParams[abilityName]!liveFormAbility[name]){errors.push(abilityName 不一致: form_config${sceneParams[abilityName]},module${liveFormAbility[name]});}}// 5. 检查摇一摇版本consttriggerTypessceneParams?.[triggerTypes]||[];if(triggerTypes.includes(shake)){warnings.push(摇一摇触发需要 HarmonyOS 7.0);}return{isValid:errors.length0,errors:errors,warnings:warnings};}}interfaceCheckResult{isValid:boolean;errors:string[];warnings:string[];}七、总结本文从配置与触发角度深入讲解了互动卡片的实战要点form_config.json 配置sceneAnimationParams的abilityName和triggerTypes是关键isDynamic必须为truemodule.json5 声明FormExtensionAbilitytype:form和LiveFormExtensionAbilitytype:liveForm双 Ability 必须同时声明点击触发卡片 →postCardAction(MESSAGE)→FormExtensionAbility.onFormEvent→requestOverflow摇一摇触发系统检测 shake →FormExtensionAbility.onUpdateForm→requestOverflow需 HarmonyOS 7.0破框区域计算通过getFormRect获取卡片尺寸计算居中偏移指定area和duration下一篇将深入讲解三方通信架构与数据传递包括动态卡片、应用、互动卡片之间的跨进程通信点击阅读通信篇 →如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源互动卡片开发实践文档华为开发者文档卡片配置文件说明华为开发者文档互动卡片示例代码GitCode开源鸿蒙跨平台社区CSDN 社区
返回列表