鸿蒙开发:了解Canvas绘制

前言

本文基于Api13

系统的组件无法满足我们的需求,这种情况下就不得不自己自定义组件,除了自定义组合组件,拓展组件,还有一种方式,那就是完全的自绘制组件,这种情况,常见的场景有,比如金融软件中的股票行情图,基金折线图,当然了也有其它的需要高度绘制的地方,鸿蒙开发中,和其它的语言类似,都是采用Canvas画布进行绘制,但是绘制的方式更趋向于Web前端中的方式。

Canvas是一个画布,并不能提供绘制的能力,但是它作为一个载体,承担了绘制的容器,目前实现绘制,提供了有两个对象,一个是DrawingRenderingContext,另一个是CanvasRenderingContext2D,本篇文章,暂不涉及概述这两个对象,我们先来了解一下绘制的基础知识。

Canvas对象,在Api12之后,增加了一个可以AI分析选项参数ImageAIOptions,通过此项可配置分析类型或绑定一个分析控制器。

TypeScript 复制代码
(context: CanvasRenderingContext2D | DrawingRenderingContext, imageAIOptions: ImageAIOptions): CanvasAttribute;

当然,也有一个支持AI分析的属性enableAnalyzer,不过需要搭配CanvasRenderingContext2D中的StartImageAnalyzer和StopImageAnalyzer一起使用。

绘制要求

在绘制之前,我们需要注意,必须等待Canvas组件初始化完成时,也就是在onReady方法中进行绘制。

先来一个简单案例,绘制一个半径为100的圆。

TypeScript 复制代码
@Entry
@Component
struct DemoPage {
  private context: DrawingRenderingContext = new DrawingRenderingContext()

  build() {
    Canvas(this.context)
      .width("100%")
      .height("100%")
      .onReady(() => {
        this.context.canvas.drawCircle(200, 200, 100)
        this.context.invalidate()
      })
  }
}

运行后,可以看到效果如下,默认是黑色。

DrawingRenderingContext介绍

DrawingRenderingContext是一个用于绘制的工具,它可以在Canvas画布组件上进行自由的绘制,比如矩形、文本、图片等等,有一个默认参数LengthMetricsUnit,主要是设置长度属性单位,有两个值可以选择,DEFAULT和PX,前者用于描述以默认的vp像素单位为单位的长度,后者用于描述以px像素单位为单位的长度。

有三个属性或方法可供选择,参数如下:

名称 类型 说明
size Size Context大小的宽和高。
canvas Canvas 绘制模块的Canvas对象,具体描述见绘制模块中的Canvas对象。
invalidate 无参 使组件无效,触发组件的重新渲染。

CanvasRenderingContext2D介绍

CanvasRenderingContext2D和DrawingRenderingContext一样,都是一个绘制工具,都可以进行绘制一些常见的矩形、文本、图片等,和DrawingRenderingContext不同的是,它的属性更加丰富,而且兼容其自身所带的功能,所以,在绘制元素上,推荐使用CanvasRenderingContext2D。

RenderingContextSettings参数主要用来配置CanvasRenderingContext2D对象的参数。

TypeScript 复制代码
constructor(settings?: RenderingContextSettings);

Api12之后新增了一个参数LengthMetricsUnit,主要用来用来配置CanvasRenderingContext2D对象的单位模式。

TypeScript 复制代码
constructor(settings?: RenderingContextSettings, unit?: LengthMetricsUnit);

使用CanvasRenderingContext2D简单绘制一个矩形:

TypeScript 复制代码
@Entry
@Component
struct DemoPage {
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

  build() {
    Canvas(this.context)
      .width('100%')
      .height('100%')
      .onReady(() => {
        this.context.fillRect(0, 0, 100, 100)
      })
  }
}

相关总结

本文主要简单的概述了Canvas绘制的基础知识,大家作为一个简单的了解即可,下面的几篇文章,我们会对相关的绘制再做进一步的分析,首先可以先做一个简单的总结:DrawingRenderingContext在使用上远远没有CanvasRenderingContext2D使用起来方便,比如在修改画笔的粗细,颜色等属性上,就可以体现出来。

相关推荐
特立独行的猫a19 小时前
CMake与GN构建系统对比及GN使用指南
harmonyos·cmake·openharmony·构建·gn
谢白羽19 小时前
vllm实践
android·vllm
电子云与长程纠缠20 小时前
Godot学习03 - 实例化、层级访问、Export
android·学习·godot
毕设源码-朱学姐20 小时前
【开题答辩全过程】以 基于Android的便民系统的设计与实现为例,包含答辩的问题和答案
android
鬼蛟21 小时前
Spring————事务
android·java·spring
qq_170264751 天前
unity出安卓年龄分级的arr包问题
android·unity·游戏引擎
kejiashao1 天前
Android View的绘制流程及事件分发机制
android
小蜜蜂嗡嗡1 天前
flutter实现付费解锁内容的遮挡
android·flutter
进击的cc1 天前
拒绝背诵!一文带你打穿 Android ANR 发生的底层全链路
android·面试
进击的cc1 天前
App 启动优化全家桶:别再只盯着 Application 了,热启动优化你真的做对了吗?
android·面试