鸿蒙开发:绘制服务卡片

简介: 服务卡片的绘制,和正常的UI绘制一样,需要注意是否支持卡片的标识,还有一点需要注意的,服务卡片虽然可以设置多个,但是最多只支持配置16个卡片,按照官方解读,若超过16个,则保留配置的前16个。

前言


本文基于Api13


绘制卡片就非常的简单了,和平时的应用开发是一样的,但是并不是所有的组件都支持卡片,这里,在官方文档中,每个组件也都有明确的标记,如果支持,那么就会有一个卡片能力显示。



上篇文章,我们默认创建了一个卡片,所有的UI绘制,都是在widget中pages下的WidgetCard中进行绘制的,当然了,由于创建的文件名不一样,文件路径也有区别,我们可以从resources->base->profile->form_config.json中的src字段查看,这个就是我们的卡片UI视图。



代码呢,也是非常的简单,和一个普通的UI页面差不多,都是通过@Component装饰器所修饰,在build里面来绘制组件。


@Entry
@Component
struct WidgetCard {
  /*
   * The title.
   */
  readonly title: string = 'Hello World';
  /*
   * The action type.
   */
  readonly actionType: string = 'router';
  /*
   * The ability name.
   */
  readonly abilityName: string = 'EntryAbility';
  /*
   * The message.
   */
  readonly message: string = 'add detail';
  /*
   * The width percentage setting.
   */
  readonly fullWidthPercent: string = '100%';
  /*
   * The height percentage setting.
   */
  readonly fullHeightPercent: string = '100%';
  build() {
    Row() {
      Column() {
        Text(this.title)
          .fontSize($r('app.float.font_size'))
          .fontWeight(FontWeight.Medium)
          .fontColor($r('sys.color.font_primary'))
      }
      .width(this.fullWidthPercent)
    }
    .height(this.fullHeightPercent)
    .onClick(() => {
      postCardAction(this, {
        action: this.actionType,
        abilityName: this.abilityName,
        params: {
          message: this.message
        }
      });
    })
  }
}


绘制呢,非常简单,本篇文章,除了基本的绘制,也会重点从修改卡片外观,多个卡片实现等业务中常见的需求来概述。


卡片外观更改


在我们创建服务卡片的时候,是不是还记得,有一个卡片外观规格的选择,默认的有以下几种。



比如选择了1 * 2,那么就表示展示的规格大小为:1行2列的二宫格;2 * 2,就是表示2行2列的四宫格,前边是行,后面是列,这个比较简单,没什么好说的。


除了默认的创建时更改卡片外观之外,我们还可以通过form_config.json来手动进行更改。



比如,我改成1*2,运行之后效果如下:



2*4效果如下:



目前支持的规格有8个,如下图所示,大家可以根据需求选择合适的那个。



多个卡片设置


鸿蒙服务卡片和其他系统一样,也是支持多个卡片设置的,设置的话,也是非常的简单,首先创建一个服务卡片的UI视图,在form_config.json配置中进行配置即可。


比如,我把卡片一复制了一份:



然后在form_config.json中的forms数组中按照卡片1的配置,复制了一份为卡片2,如下:


{
  "forms": [
    {
      "name": "widget",
      "displayName": "$string:widget_display_name",
      "description": "$string:widget_desc",
      "src": "./ets/widget/pages/WidgetCard.ets",
      "uiSyntax": "arkts",
      "window": {
        "designWidth": 720,
        "autoDesignWidth": true
      },
      "colorMode": "auto",
      "isDynamic": true,
      "isDefault": true,
      "updateEnabled": false,
      "scheduledUpdateTime": "10:30",
      "updateDuration": 1,
      "defaultDimension": "2*2",
      "supportDimensions": [
        "2*2"
      ]
    },
    {
      "name": "widget2",
      "displayName": "$string:widget_display_name2",
      "description": "$string:widget_desc2",
      "src": "./ets/widget/pages/WidgetCard2.ets",
      "uiSyntax": "arkts",
      "window": {
        "designWidth": 720,
        "autoDesignWidth": true
      },
      "colorMode": "auto",
      "isDynamic": true,
      "isDefault": false,
      "updateEnabled": false,
      "scheduledUpdateTime": "10:30",
      "updateDuration": 1,
      "defaultDimension": "2*4",
      "supportDimensions": [
        "2*4"
      ]
    }
  ]
}


以上的信息,只是用来测试,在实际的开发中,请以真实的数据为主,isDefault是默认的卡片,记住,只能存在一个,每个卡片其规格大小都可以进行改变,设置完之后,我们再次运行,就会有两个卡片供我们选择了。



每个卡片,都可以进行添加桌面上。



卡片UI绘制


UI绘制,没有多大的限制,凡是标注支持卡片能力的组件都可以进行使用,可以随意的进行绘制;本身卡片也开放了自定义绘制的能力,也就是说,你可以通过Canvas组件创建画布,然后结合CanvasRenderingContext2D对象,进行自定义图形绘制。


比如以上的案例,我给两个组件做了简单的修改:



当然了,你也可以通过Canvas进行绘制,比如简单绘制一个圆:


定义CanvasRenderingContext2D


private canvasWidth: number = 0;
  private canvasHeight: number = 0;
  // 初始化CanvasRenderingContext2D和RenderingContextSettings
  private settings: RenderingContextSettings = new RenderingContextSettings(true);
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);


Canvas组件绘制圆,直接加载到build函数中即可。


Canvas(this.context)
        .width('100%')
        .height('100%')
        .onReady(() => {
          // 在onReady回调中获取画布的实际宽和高
          this.canvasWidth = this.context.width;
          this.canvasHeight = this.context.height;
          // 绘制画布的背景
          this.context.fillStyle = '#ffffff';
          this.context.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
          // 在画布的中心绘制一个圆
          this.context.beginPath();
          let radius = this.context.width / 3;
          let circleX = this.context.width / 2;
          let circleY = this.context.height / 2;
          this.context.moveTo(circleX - radius, circleY);
          this.context.arc(circleX, circleY, radius, 2 * Math.PI, 0, true);
          this.context.closePath();
          this.context.fillStyle = '#000000';
          this.context.fill();
        })


效果如下:



相关总结


服务卡片的绘制,和正常的UI绘制一样,需要注意是否支持卡片的标识,还有一点需要注意的,服务卡片虽然可以设置多个,但是最多只支持配置16个卡片,按照官方解读,若超过16个,则保留配置的前16个。


本文标签:HarmonyOS/服务卡片

相关文章
|
21天前
|
开发者
鸿蒙开发:资讯项目实战之项目初始化搭建
目前来说,我们的资讯项目只是往前迈了很小的一步,仅仅实现了项目创建,步虽小,但概念性的知识很多,这也是这个项目的初衷,让大家不仅仅可以掌握日常的技术开发,也能让大家理解实际的项目开发知识。
鸿蒙开发:资讯项目实战之项目初始化搭建
|
15天前
|
缓存 JavaScript IDE
鸿蒙开发:基于最新API,如何实现组件化运行
手动只是让大家了解切换的原理,在实际开发中,可不推荐手动,下篇文章,我们将通过脚本或者插件,快速实现组件化模块之间的切换,实现独立运行,敬请期待!
鸿蒙开发:基于最新API,如何实现组件化运行
|
21天前
|
SQL 弹性计算 数据库
鸿蒙5开发宝藏案例分享---优化应用时延问题
鸿蒙性能优化指南来了!从UI渲染到数据库操作,6大实战案例助你提升应用流畅度。布局层级优化、数据加载并发、数据库查询提速、相机资源延迟释放、手势识别灵敏调整及转场动画精调,全面覆盖性能痛点。附赠性能自检清单,帮助开发者高效定位问题,让应用运行如飞!来自华为官方文档的精华内容,建议收藏并反复研读,共同探讨更多优化技巧。
|
21天前
|
缓存
鸿蒙5开发宝藏案例分享---Swiper组件性能优化实战
本文分享了鸿蒙系统中Swiper组件的性能优化技巧,包括:1) 使用`LazyForEach`替代`ForEach`实现懒加载,显著降低内存占用;2) 通过`cachedCount`精准控制缓存数量,平衡流畅度与内存消耗;3) 利用`onAnimationStart`在抛滑时提前加载资源,提升构建效率;4) 添加`@Reusable`装饰器复用组件实例,减少创建开销。实际应用后,图库页帧率从45fps提升至58fps,效果显著。适合处理复杂列表或轮播场景,欢迎交流经验!
|
21天前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
21天前
|
数据库
鸿蒙5开发宝藏案例分享---跨线程性能优化指南
本文深入探讨鸿蒙系统跨线程序列化性能优化,借助DevEco Profiler工具定位序列化瓶颈。通过Sendable接口改造、数据瘦身等方法,将5万本书对象的序列化耗时从260ms+降至<8ms,甚至<1ms。总结避坑经验,建议常态化使用Profiler检测,避免传递大对象,提升多线程开发效率。
|
缓存 数据管理 Shell
鸿蒙5开发宝藏案例分享---性能分析简介
鸿蒙开发资源大揭秘!文中整理了HarmonyOS官方提供的100+场景化案例,涵盖性能优化、UI设计、设备适配等全链路内容。重点解析三大神级案例:折叠屏悬停交互、万人列表流畅滚动和服务卡片实时刷新,附带完整代码与避坑指南。通过精准搜索、代码移植和调试技巧,高效利用这些宝藏资源,助你省时省力避开开发陷阱。更有抖音级短视频流畅度优化方案等彩蛋等待探索!
|
21天前
|
Java
鸿蒙5开发宝藏案例分享---性能检测工具揭秘
鸿蒙性能优化工具全揭秘!本文详解官方隐藏的性能调优利器,包括静态检测(Code Linter)与动态检测(AppAnalyzer)。通过实战案例解析稀疏数组陷阱、循环更新状态变量等问题,并提供优化方案。同时附带高频性能规则速查表及黄金法则,助你高效避坑。开发时建议双开工具,实时检测问题,提升应用性能。
|
缓存 Shell 开发者
鸿蒙5开发宝藏案例分享---性能体验设计
这是一篇关于HarmonyOS性能优化的开发者实践指南。文章结合官方文档案例与代码实现,分享了流畅性设计的实用技巧,包括感知流畅性的核心原则、交互流畅实战案例(如列表滑动优化和点击响应加速)、视觉流畅的动效设计,以及性能检测工具ArkUI Inspector的使用方法。最后还提供了冷启动优化的具体策略。通过这些内容,帮助开发者打造60帧无卡顿的鸿蒙应用,实现操作响应快速、动效流畅的目标。
|
21天前
|
存储 C++ UED
鸿蒙5开发宝藏案例分享---优化应用包体积大小问题
本文分享了鸿蒙应用包体积优化的实用技巧,包括SO库压缩、HSP动态共享包、OHPM依赖冲突解决、按需加载和扫描工具定位优化点等方法。通过具体配置示例和实战经验,如启用`compressNativeLibs`、使用共享资源包、强制统一依赖版本以及动态导入功能模块,帮助开发者显著减少包体积,提升用户体验。文中还提供了图标优化、资源混淆和无用代码剔除等补充建议,助力打造更轻量的鸿蒙应用。