普通卡片如何发起互动区域参考标题普通卡片自己不能直接展开互动区域。它要先发消息给EntryFormAbility再由EntryFormAbility调用formProvider.requestOverflow()。这篇讲的就是这条消息怎么发。效果图这篇开始进入“点一下普通卡片怎么发起互动区域”。先看一个最典型的效果普通卡片发出动作后LiveForm 承接并展示展开反馈。接下来重点看普通卡片怎么把这个动作发出去。先看项目里的 ActionUtils文件位置entry/src/main/ets/utils/ActionUtils.ets这个工具类是卡片和应用通信的桥梁。项目里的普通卡片不会到处写postCardAction而是统一调用ActionUtils。这样做很重要。否则每张卡片都自己拼参数后面维护会非常乱。三类动作先分清项目里定义了exportenumFormCarAction{CALLcall,ROUTERrouter,MESSAGEmessage}小白可以这样理解CALL调用应用能力比如播放音乐、收藏歌曲、开始运动。ROUTER跳转到应用页面比如MusicPage、DeliveryPage。MESSAGE发消息给EntryFormAbility比如请求展开互动区。拉起 LiveForm 用的是MESSAGE。requestOverFlow 的代码项目里的封装是publicrequestOverFlow(component:object,widthRatio:number,heightRatio:number,duration:number):void{postCardAction(component,{action:FormCarAction.MESSAGE,abilityName:ENTRY_FORM_ABILITY,params:{message:requestOverflow,widthRatio:widthRatio,heightRatio:heightRatio,duration:duration}});}逐个参数看。component一般传this。它代表当前卡片组件上下文。widthRatio是互动区域宽度比例比如快递卡片用1.45。heightRatio是互动区域高度比例。duration是互动区域持续时间项目里统一用LIVE_CARD_DURATION。abilityName 为什么是 EntryFormAbility这里写的是abilityName:ENTRY_FORM_ABILITY常量定义在FormCardConstant.etsexportconstENTRY_FORM_ABILITYEntryFormAbility;因为requestOverflow必须由FormExtensionAbility处理不是普通EntryAbility处理。这点很容易错。播放音乐用ENTRY_ABILITY展开互动区用ENTRY_FORM_ABILITY。普通卡片怎么调用以快递卡片为例.onClick((){ActionUtils.requestOverFlow(this,LiveCardScale.DELIVERY_WIDTH,LiveCardScale.DELIVERY_HEIGHT,LIVE_CARD_DURATION);});以音乐卡片为例播放时还会带触发动作ActionUtils.requestOverFlowWithAction(this,LiveCardScale.MUSIC_WIDTH,LiveCardScale.MUSIC_HEIGHT,LIVE_CARD_DURATION,PLAY,this.songId);音乐为什么要多传triggerAction和songId因为 LiveForm 需要知道这次是播放、上一首还是下一首才能选择不同动画。EntryFormAbility 怎么接收EntryFormAbility.ets里有asynconFormEvent(formId:string,message:string):Promisevoid{constparams:Recordstring,ObjectJSON.parse(message);letshortMessage:stringparams.messageasstring;if(shortMessagerequestOverflow){letwidthRatio:numberparams.widthRatioasnumber;letheightRatio:numberparams.heightRatioasnumber;letduration:numberparams.durationasnumber;this.requestOverflow(formId,widthRatio,heightRatio,duration);return;}}这就是普通卡片消息的接收点。postCardAction发送的params会变成message字符串onFormEvent()里再JSON.parse()解析回来。小白练习写一个最小触发按钮你可以在任意普通卡片页面里写Button(展开互动区).onClick((){ActionUtils.requestOverFlow(this,1.3,1.3,3000);})前提是这张普通卡片的form_config.json里已经配置了sceneAnimationParams:{abilityName:你的LiveFormAbility}否则按钮点了也不知道该展开哪个 LiveForm。排查顺序点击普通卡片没反应时按这个顺序查普通卡片点击事件有没有触发。ActionUtils.requestOverFlow()参数有没有传对。abilityName是否是EntryFormAbility。EntryFormAbility.onFormEvent()是否收到requestOverflow。widthRatio、heightRatio是否为有效数字。formProvider.requestOverflow()是否报错。写在最后普通卡片不要直接操心 LiveForm 怎么加载。它只要把“我要展开互动区”这个意图发出去就行。记住这条规则普通卡片发MESSAGEEntryFormAbility负责真正的requestOverflow。