当前位置:   article > 正文

鸿蒙HarmonyOS ArkUI开发-服务卡片-今天吃什么_harmonyos arkts简单的服务卡片案例

harmonyos arkts简单的服务卡片案例

        今天做一个鸿蒙的服务卡片,具体效果如图所示。

一、效果图

二、实现方法

(1)创建卡片

参照开发者官网给出的开发方法,只需要简单操作就能实现一个服务卡片的创建:

在已有的应用工程中,创建ArkTS卡片,具体操作方式如下。

  1. 创建卡片
  2. 根据实际业务场景,选择一个卡片模板。
  3. 在选择卡片的开发语言类型(Language)时,选择ArkTS选项,然后单击“Finish”,即可完成ArkTS卡片创建。
  4. ArkTS卡片创建完成后,工程中会新增如下卡片相关文件:卡片生命周期管理文件(EntryFormAbility.ts)、卡片页面文件(WidgetCard.ets)和卡片配置文件(form_config.json)。
(2)编写卡片布局

        开发者可以使用声明式范式开发ArkTS卡片页面。如下卡片页面由DevEco Studio模板自动生成,开发者可以根据自身的业务场景进行调整。

        ArkTS卡片具备JS卡片的全量能力,并且新增了动效能力和自定义绘制的能力,支持声明式范式的部分组件、事件、动效、数据管理、状态管理能力,详见“ArkTS卡片支持的页面能力”。

实现本文效果图中的效果只需要修改两个文件,WidgetCard.ets和EntryFormAbility.ets文件。

首先WidgetCard.ets文件是卡片布局代码,具体代码如下:

  1. let storage = new LocalStorage();
  2. @Entry(storage)
  3. @Component
  4. // 定义 WidgetCard 数据结构
  5. struct WidgetCard {
  6. @LocalStorageProp('detail') detail: string = '今天吃什么';
  7. @State translateY1: number = 50; // 第一个文本的垂直位移
  8. @State translateY2: number = 50; // 第二个文本的垂直位移
  9. @State opacityValue1: number = 1; // 第一个文本的透明度,初始值为 1 用于淡入效果
  10. @State opacityValue2: number = 1; // 第二个文本的透明度,初始值为 1 用于淡入效果
  11. flag: boolean = true; // 用于切换动画状态的标志位
  12. // 渲染函数
  13. build() {
  14. Column() {
  15. Stack() {
  16. // 第一个文本
  17. Text(`${this.detail}`)
  18. .fontSize(20)
  19. .lineHeight(24)
  20. .translate({ x: 0, y: this.translateY1 })
  21. .width('100%')
  22. .textAlign(TextAlign.Center)
  23. .animation({
  24. curve: Curve.EaseInOut,
  25. playMode: PlayMode.Normal,
  26. duration: 400,
  27. })
  28. .opacity(this.opacityValue1)
  29. .fontColor("#F6F6F6")
  30. .fontWeight(FontWeight.Bold)
  31. // 第二个文本
  32. Text(`${this.detail}`)
  33. .fontSize(20)
  34. .lineHeight(24)
  35. .translate({ x: 0, y: this.translateY2 }) // 使用 translateY2 作为第二个文本的垂直位移
  36. .width('100%')
  37. .textAlign(TextAlign.Center)
  38. .animation({
  39. curve: Curve.EaseInOut,
  40. playMode: PlayMode.Normal,
  41. duration: 400,
  42. })
  43. .opacity(this.opacityValue2)
  44. .fontColor("#F6F6F6")
  45. .fontWeight(FontWeight.Bold)
  46. }
  47. }
  48. .alignItems(HorizontalAlign.Center)
  49. .justifyContent(FlexAlign.Center)
  50. .backgroundColor(Color.Blue)
  51. .onClick(() => {
  52. // 发送卡片动作消息
  53. postCardAction(this, {
  54. 'action': 'message',
  55. 'params': {
  56. 'msgTest': 'messageEvent',
  57. },
  58. });
  59. // 切换动画状态
  60. if (this.flag) {
  61. this.flag = !this.flag
  62. this.translateY1 = -50;
  63. this.translateY2 = 0;
  64. this.opacityValue1 = 0;
  65. this.opacityValue2 = 1;
  66. } else {
  67. this.flag = !this.flag
  68. this.translateY1 = 0;
  69. this.translateY2 = 50;
  70. this.opacityValue1 = 1;
  71. this.opacityValue2 = 0;
  72. }
  73. })
  74. .width('100%')
  75. .height('100%')
  76. .backgroundColor("#00B0FF") // 设置背景颜色
  77. }
  78. }

        以上代码主要实现的功能是通过点击事件触发两个文本的属性动画,一个淡入界面,一个淡出界面。 同时,点击事件还调用了postCardAction方法,这个方法触发的message事件可以拉起FormExtensionAbility,然后由FormExtensionAbility刷新卡片内容。

(3)通过message事件刷新卡片内容

       具体来说,通过message事件来刷新卡片内容的方法如下:在FormExtensionAbility中,通过onFormEvent方法处理从WidgetCard发送过来的事件,并切换菜单数据。相关的EntryFormAbility.ets文件代码如下:

  1. import formInfo from '@ohos.app.form.formInfo';
  2. import formBindingData from '@ohos.app.form.formBindingData';
  3. import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';
  4. import formProvider from '@ohos.app.form.formProvider';
  5. export default class EntryFormAbility extends FormExtensionAbility {
  6. data: string[] = [
  7. '红烧肉',
  8. '清蒸鲈鱼',
  9. '香辣牛肉面',
  10. '麻辣火锅',
  11. '糖醋排骨',
  12. '梅菜扣肉',
  13. '宫保鸡丁',
  14. '西红柿鸡蛋面'
  15. ];
  16. onAddForm(want) {
  17. // Called to return a FormBindingData object.
  18. let formData = {};
  19. return formBindingData.createFormBindingData(formData);
  20. }
  21. onCastToNormalForm(formId) {
  22. // Called when the form provider is notified that a temporary form is successfully
  23. // converted to a normal form.
  24. }
  25. onUpdateForm(formId) {
  26. // Called to notify the form provider to update a specified form.
  27. }
  28. onChangeFormVisibility(newStatus) {
  29. // Called when the form provider receives form events from the system.
  30. }
  31. onFormEvent(formId, message) {
  32. let number = this.data.length;
  33. let formData = {
  34. 'detail': this.data[Math.round(Math.random() * (number - 1))], // 和卡片布局中对应
  35. };
  36. let formInfo = formBindingData.createFormBindingData(formData)
  37. formProvider.updateForm(formId, formInfo).then((data) => {
  38. console.info('FormAbility updateForm success.' + JSON.stringify(data));
  39. }).catch((error) => {
  40. console.error('FormAbility updateForm failed: ' + JSON.stringify(error));
  41. })
  42. }
  43. onRemoveForm(formId) {
  44. // Called to notify the form provider that a specified form has been destroyed.
  45. }
  46. onAcquireFormState(want) {
  47. // Called to return a {@link FormState} object.
  48. return formInfo.FormState.READY;
  49. }
  50. };

在onFormEvent方法中,通过formProvider.updateForm刷新了卡片的状态。

三、项目地址

FoodPicker: 鸿蒙HarmonyOS ArkUI开发-服务卡片-今天吃什么

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号