• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# CanvasRenderingContext2D
2
3使用RenderingContext在Canvas组件上进行绘制,绘制对象可以是矩形、文本、图片等。
4
5> **说明:**
6>
7> 从API version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8>
9> 本文绘制接口在调用时会存入被关联的Canvas组件的指令队列中。仅当当前帧进入渲染阶段且关联的Canvas组件处于可见状态时,这些指令才会从队列中被提取并执行。因此,在Canvas组件不可见的情况下,应尽量避免频繁调用绘制接口,以防止指令在队列中堆积,从而避免内存占用过大的问题。
10>
11> Canvas组件的宽或高超过8000px时使用CPU渲染,会导致性能明显下降。
12
13
14
15## 接口
16
17CanvasRenderingContext2D(settings?: RenderingContextSettings, unit?: LengthMetricsUnit)
18
19**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
20
21**原子化服务API:** 在API version 11中,该接口支持在原子化服务中使用。
22
23**系统能力:** SystemCapability.ArkUI.ArkUI.Full
24
25**参数:**
26
27| 参数名      | 类型  | 必填   | 说明    |
28| -------- | ---------------------------------------- | ---- | ---------------------------------------- |
29| settings | [RenderingContextSettings](#renderingcontextsettings) | 否    | 用来配置CanvasRenderingContext2D对象的参数,见[RenderingContextSettings](#renderingcontextsettings)。 |
30| unit<sup>12+</sup>  | [LengthMetricsUnit](../js-apis-arkui-graphics.md#lengthmetricsunit12) | 否    | 用来配置CanvasRenderingContext2D对象的单位模式,配置后无法更改,见[LengthMetricsUnit](#lengthmetricsunit12)。<br>默认值:DEFAULT。 |
31
32
33### RenderingContextSettings
34
35RenderingContextSettings(antialias?: boolean)
36
37用来配置CanvasRenderingContext2D对象的参数,包括是否开启抗锯齿。
38
39**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
40
41**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
42
43**系统能力:** SystemCapability.ArkUI.ArkUI.Full
44
45**参数:**
46
47| 参数名       | 类型    | 必填   | 说明                          |
48| --------- | ------- | ---- | ----------------------------- |
49| antialias | boolean | 否    | 表明canvas是否开启抗锯齿。<br>默认值:false。 |
50
51### LengthMetricsUnit<sup>12+</sup>
52
53用来配置CanvasRenderingContext2D对象的单位模式,默认单位模式为LengthMetricsUnit.DEFAULT,对应默认单位vp,配置后无法动态更改,详细说明见[LengthMetricsUnit](../js-apis-arkui-graphics.md#lengthmetricsunit12)。
54
55**示例:**
56
57```ts
58// xxx.ets
59import { LengthMetricsUnit } from '@kit.ArkUI'
60
61@Entry
62@Component
63struct LengthMetricsUnitDemo {
64  private settings: RenderingContextSettings = new RenderingContextSettings(true);
65  private contextPX: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings, LengthMetricsUnit.PX);
66  private contextVP: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
67
68  build() {
69    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
70      Canvas(this.contextPX)
71        .width('100%')
72        .height(150)
73        .backgroundColor('#ffff00')
74        .onReady(() => {
75          this.contextPX.fillRect(10,10,100,100)
76          this.contextPX.clearRect(10,10,50,50)
77        })
78
79      Canvas(this.contextVP)
80        .width('100%')
81        .height(150)
82        .backgroundColor('#ffff00')
83        .onReady(() => {
84          this.contextVP.fillRect(10,10,100,100)
85          this.contextVP.clearRect(10,10,50,50)
86        })
87    }
88    .width('100%')
89    .height('100%')
90  }
91}
92```
93
94![CanvasContext2DUnitMode](figures/CanvasContext2DUnitMode.png)
95
96## 属性
97
98**系统能力:** SystemCapability.ArkUI.ArkUI.Full
99
100| 名称 | 类型 | 只读 | 可选 | 说明 |
101| --------- | ------------------------------- | ------------------ | ---------------------- | ---------------------------------------- |
102| [fillStyle](#fillstyle) | string&nbsp;\|number<sup>10+</sup>&nbsp;\|[CanvasGradient](ts-components-canvas-canvasgradient.md)&nbsp;\|&nbsp;[CanvasPattern](ts-components-canvas-canvaspattern.md#canvaspattern) | 否 | 否 | 指定绘制的填充色。<br/>-&nbsp;类型为string时,表示设置填充区域的颜色,颜色格式参考[ResourceColor](ts-types.md#resourcecolor)中string类型说明。<br/>默认值:'#000000'<br/>- 类型为number时,表示设置填充区域的颜色,不支持设置全透明色,颜色格式参考[ResourceColor](ts-types.md#resourcecolor)中number类型说明。<br/>默认值:0x000000<br/>-&nbsp;类型为CanvasGradient时,表示渐变对象,使用[createLinearGradient](#createlineargradient)方法创建。<br/>-&nbsp;类型为CanvasPattern时,使用[createPattern](#createpattern)方法创建。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
103| [lineWidth](#linewidth) | number | 否 | 否 | 设置绘制线条的宽度。<br/>默认值:1(px)<br/>默认单位:vp <br/> linewidth取值不支持0和负数,0和负数按异常值处理,异常值按默认值处理。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
104| [strokeStyle](#strokestyle)              | string&nbsp;\|number<sup>10+</sup>&nbsp;\|[CanvasGradient](ts-components-canvas-canvasgradient.md)&nbsp;\|&nbsp;[CanvasPattern](ts-components-canvas-canvaspattern.md#canvaspattern)  | 否 | 否 | 设置线条的颜色。<br/>-&nbsp;类型为string时,表示设置线条使用的颜色,颜色格式参考[ResourceColor](ts-types.md#resourcecolor)中string类型说明。<br/>默认值:'#000000'<br/>- 类型为number时,表示设置线条使用的颜色,不支持设置全透明色,颜色格式参考[ResourceColor](ts-types.md#resourcecolor)中number类型说明。<br/>默认值:0x000000<br/>-&nbsp;类型为CanvasGradient时,表示渐变对象,使用[createLinearGradient](#createlineargradient)方法创建。<br/>-&nbsp;类型为CanvasPattern时,使用[createPattern](#createpattern)方法创建。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
105| [lineCap](#linecap)                      | [CanvasLineCap](#canvaslinecap类型说明) | 否 | 否 | 指定线端点的样式,可选值为:<br/>-&nbsp;'butt':线端点以方形结束。<br/>-&nbsp;'round':线端点以圆形结束。<br/>-&nbsp;'square':线端点以方形结束,该样式下会增加一个长度和线段厚度相同,宽度是线段厚度一半的矩形。<br/>默认值:'butt'。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
106| [lineJoin](#linejoin)                    | [CanvasLineJoin](#canvaslinejoin类型说明) | 否 | 否 | 指定线段间相交的交点样式,可选值为:<br/>-&nbsp;'round':在线段相连处绘制一个扇形,扇形的圆角半径是线段的宽度。<br/>-&nbsp;'bevel':在线段相连处使用三角形为底填充,&nbsp;每个部分矩形拐角独立。<br/>-&nbsp;'miter':在相连部分的外边缘处进行延伸,使其相交于一点,形成一个菱形区域,该属性可以通过设置miterLimit属性展现效果。<br/>默认值:'miter'。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
107| [miterLimit](#miterlimit)                | number | 否 | 否 | 设置斜接面限制值,该值指定了线条相交处内角和外角的距离。  <br/>默认值:10px<br/>单位:px<br/>miterLimit取值不支持0和负数,0和负数按异常值处理,异常值按默认值处理。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
108| [font](#font)                            | string | 否 | 否 | 设置文本绘制中的字体样式。<br/>语法:ctx.font='font-style&nbsp;font-weight&nbsp;font-size&nbsp;font-family'<br/>-&nbsp;font-style(可选),用于指定字体样式,支持如下几种样式:'normal','italic'。<br/>-&nbsp;font-weight(可选),用于指定字体的粗细,支持如下几种类型:'normal',&nbsp;'bold',&nbsp;'bolder',&nbsp;'lighter',&nbsp;100,&nbsp;200,&nbsp;300,&nbsp;400,&nbsp;500,&nbsp;600,&nbsp;700,&nbsp;800,&nbsp;900。<br/>-&nbsp;font-size(可选),指定字号和行高,单位支持px、vp。使用时需要添加单位。<br/>-&nbsp;font-family(可选),指定字体系列,支持如下几种类型:'sans-serif',&nbsp;'serif',&nbsp;'monospace'。同时支持注册过的自定义字体(DevEco Studio的预览器不支持显示自定义字体),具体使用方法参考[自定义字体示例](#font)。<br/>默认值:'normal normal 14px sans-serif'。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
109| [textAlign](#textalign)                  | [CanvasTextAlign](#canvastextalign类型说明) | 否 | 否 | 设置文本绘制中的文本对齐方式,可选值为:<br/>-&nbsp;'left':文本左对齐。<br/>-&nbsp;'right':文本右对齐。<br/>-&nbsp;'center':文本居中对齐。<br/>-&nbsp;'start':文本对齐界线开始的地方。<br/>-&nbsp;'end':文本对齐界线结束的地方。<br/>ltr布局模式下'start'和'left'一致,rtl布局模式下'start'和'right'一致·。<br/>默认值:'left'。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
110| [textBaseline](#textbaseline)            | [CanvasTextBaseline](#canvastextbaseline类型说明) | 否 | 否 | 设置文本绘制中的水平对齐方式,可选值为:<br/>-&nbsp;'alphabetic':文本基线是标准的字母基线。<br/>-&nbsp;'top':文本基线在文本块的顶部。<br/>-&nbsp;'hanging':文本基线是悬挂基线。<br/>-&nbsp;'middle':文本基线在文本块的中间。<br/>-&nbsp;'ideographic':文字基线是表意字基线;如果字符本身超出了alphabetic基线,那么ideograhpic基线位置在字符本身的底部。<br/>-&nbsp;'bottom':文本基线在文本块的底部。&nbsp;与ideographic基线的区别在于ideographic基线不需要考虑下行字母。<br/>默认值:'alphabetic'。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
111| [globalAlpha](#globalalpha)              | number | 否 | 否 | 设置透明度,范围为[0.0, 1.0],0.0为完全透明,1.0为完全不透明。若给定值小于0.0,则取值0.0;若给定值大于1.0,则取值1.0.<br/>默认值:1.0。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
112| [lineDashOffset](#linedashoffset)        | number | 否 | 否 | 设置画布的虚线偏移量,精度为float。    <br/>默认值:0.0<br/>默认单位:vp。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
113| [globalCompositeOperation](#globalcompositeoperation) | string | 否 | 否 | 设置合成操作的方式。类型字段可选值有'source-over','source-atop','source-in','source-out','destination-over','destination-atop','destination-in','destination-out','lighter','copy','xor'。<br/>默认值:'source-over'。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
114| [shadowBlur](#shadowblur)                | number | 否 | 否 | 设置绘制阴影时的模糊级别,值越大越模糊,精度为float,取值范围≥0。   <br/>默认值:0.0<br/>单位:px。<br/>shadowBlur取值不支持负数,负数按异常值处理,异常值按默认值处理。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
115| [shadowColor](#shadowcolor)              | string | 否 | 否 | 设置绘制阴影时的阴影颜色,颜色格式参考[ResourceColor](ts-types.md#resourcecolor)中string类型说明。<br/>默认值:透明黑色。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
116| [shadowOffsetX](#shadowoffsetx)          | number | 否 | 否 | 设置绘制阴影时和原有对象的水平偏移值。<br/>默认值:0.0<br/>默认单位:vp。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
117| [shadowOffsetY](#shadowoffsety)          | number | 否 | 否 | 设置绘制阴影时和原有对象的垂直偏移值。<br/>默认值:0.0<br/>默认单位:vp。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
118| [imageSmoothingEnabled](#imagesmoothingenabled) | boolean | 否 | 否 | 用于设置绘制图片时是否进行图像平滑度调整,true为启用,false为不启用。 <br/>默认值:true。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
119| [height](#height)                        | number | 是 | 否 | 组件高度。 <br/>默认单位:vp。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
120| [width](#width)                          | number | 是 | 否 | 组件宽度。 <br/>默认单位:vp。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
121| [imageSmoothingQuality](#imagesmoothingquality) | [ImageSmoothingQuality](#imagesmoothingquality类型说明) | 否 | 否 | imageSmoothingEnabled为true时,用于设置图像平滑度。<br/>默认值:"low"。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
122| [direction](#direction)                  | [CanvasDirection](#canvasdirection类型说明) | 否 | 否 | 用于设置绘制文字时使用的文字方向。<br/>默认值:"inherit"。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
123|  [filter](#filter)                        | string | 否 | 否 | 用于设置图像的滤镜,可以组合任意数量的滤镜。<br/>支持的滤镜效果如下:<br/>- 'none': 无滤镜效果。<br/>- 'blur(\<length>)':给图像设置高斯模糊,取值范围≥0,支持单位px、vp、rem,默认单位:vp,默认值:blur(0px)。<br/>- 'brightness([\<number>\|\<percentage>])':给图片应用一种线性乘法,使其看起来更亮或更暗,支持数字和百分比参数,取值范围≥0,默认值:brightness(1)。<br/>- 'contrast([\<number>\|\<percentage>])':调整图像的对比度,支持数字和百分比参数,取值范围≥0,默认值:contrast(1)。<br/>- 'grayscale([\<number>\|\<percentage>])':将图像转换为灰度图像,支持数字和百分比参数,取值范围[0, 1],默认值:grayscale(0)。<br/>- 'hue-rotate(\<angle>)':给图像应用色相旋转,取值范围0deg-360deg,默认值:hue-rotate(0deg)<br/>- 'invert([\<number>\|\<percentage>])':反转输入图像,支持数字和百分比参数,取值范围[0, 1],默认值:invert(0)。<br/>- 'opacity([\<number>\|\<percentage>])':转化图像的透明程度,支持数字和百分比参数,取值范围[0, 1],默认值:opacity(1)。<br/>- 'saturate([\<number>\|\<percentage>])':转换图像饱和度,支持数字和百分比参数,取值范围≥0,默认值:saturate(1)。<br/>- 'sepia([\<number>\|\<percentage>])':将图像转换为深褐色,支持数字和百分比参数,取值范围[0, 1],默认值:sepia(0)。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
124| [canvas<sup>13+</sup>](#canvas13)                        | [FrameNode](../../apis-arkui/js-apis-arkui-frameNode.md) | 是 | 否 | 获取和CanvasRenderingContext2D关联的Canvas组件的FrameNode实例。<br/>可用于监听关联的Canvas组件的可见状态。<br/>默认值:null。<br/>**原子化服务API:** 从API version 13开始,该接口支持在原子化服务中使用。 |
125| [letterSpacing<sup>18+</sup>](#letterspacing18)                  | string&nbsp;\| [LengthMetrics](../js-apis-arkui-graphics.md#lengthmetrics12) | 否 | 否 | 当使用LengthMetrics时:<br/>字间距按照指定的单位设置;<br/>不支持FP、PERCENT和LPX(按无效值处理);<br/>支持负数和小数,设为小数时字间距不四舍五入。<br/>当使用string时:<br/>不支持设置百分比(按无效值处理);<br/>支持负数和小数,设为小数时字间距不四舍五入;<br/>若letterSpacing的赋值未指定单位(例如:letterSpacing='10'),且未指定LengthMetricsUnit时,默认单位设置为vp;<br/>指定LengthMetricsUnit为px时,默认单位设置为px;<br/>当letterSpacing的赋值指定单位时(例如:letterSpacing='10vp'),字间距按照指定的单位设置。<br/>默认值:0(输入无效值时,字间距设为默认值)<br/>注:推荐使用LengthMetrics,性能更好。<br/>**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 |
126
127> **说明:**
128>
129> fillStyle、shadowColor与 strokeStyle 中string类型格式为 'rgb(255, 255, 255)','rgba(255, 255, 255, 1.0)','\#FFFFFF'。
130
131
132### fillStyle
133
134```ts
135// xxx.ets
136@Entry
137@Component
138struct FillStyleExample {
139  private settings: RenderingContextSettings = new RenderingContextSettings(true)
140  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
141
142  build() {
143    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
144      Canvas(this.context)
145        .width('100%')
146        .height('100%')
147        .backgroundColor('#ffff00')
148        .onReady(() =>{
149          this.context.fillStyle = '#0000ff'
150          this.context.fillRect(20, 20, 150, 100)
151        })
152    }
153    .width('100%')
154    .height('100%')
155  }
156}
157```
158
159![zh-cn_image_0000001238712411](figures/zh-cn_image_0000001238712411.png)
160
161
162### lineWidth
163
164```ts
165// xxx.ets
166@Entry
167@Component
168struct LineWidthExample {
169  private settings: RenderingContextSettings = new RenderingContextSettings(true)
170  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
171
172  build() {
173    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
174      Canvas(this.context)
175        .width('100%')
176        .height('100%')
177        .backgroundColor('#ffff00')
178        .onReady(() =>{
179        this.context.lineWidth = 5
180        this.context.strokeRect(25, 25, 85, 105)
181      })
182    }
183    .width('100%')
184    .height('100%')
185  }
186}
187```
188
189![zh-cn_image_0000001194192432](figures/zh-cn_image_0000001194192432.png)
190
191
192### strokeStyle
193
194```ts
195// xxx.ets
196@Entry
197@Component
198struct StrokeStyleExample {
199  private settings: RenderingContextSettings = new RenderingContextSettings(true)
200  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
201
202  build() {
203    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
204      Canvas(this.context)
205        .width('100%')
206        .height('100%')
207        .backgroundColor('#ffff00')
208        .onReady(() =>{
209          this.context.lineWidth = 10
210          this.context.strokeStyle = '#0000ff'
211          this.context.strokeRect(25, 25, 155, 105)
212        })
213    }
214    .width('100%')
215    .height('100%')
216  }
217}
218```
219
220
221![zh-cn_image_0000001194352432](figures/zh-cn_image_0000001194352432.png)
222
223
224### lineCap
225
226```ts
227// xxx.ets
228@Entry
229@Component
230struct LineCapExample {
231  private settings: RenderingContextSettings = new RenderingContextSettings(true)
232  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
233
234  build() {
235    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
236      Canvas(this.context)
237        .width('100%')
238        .height('100%')
239        .backgroundColor('#ffff00')
240        .onReady(() =>{
241          this.context.lineWidth = 8
242          this.context.beginPath()
243          this.context.lineCap = 'round'
244          this.context.moveTo(30, 50)
245          this.context.lineTo(220, 50)
246          this.context.stroke()
247        })
248    }
249    .width('100%')
250    .height('100%')
251  }
252}
253```
254
255![zh-cn_image_0000001238952373](figures/zh-cn_image_0000001238952373.png)
256
257
258### lineJoin
259
260```ts
261// xxx.ets
262@Entry
263@Component
264struct LineJoinExample {
265  private settings: RenderingContextSettings = new RenderingContextSettings(true)
266  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
267
268  build() {
269    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
270      Canvas(this.context)
271        .width('100%')
272        .height('100%')
273        .backgroundColor('#ffff00')
274        .onReady(() =>{
275        this.context.beginPath()
276        this.context.lineWidth = 8
277        this.context.lineJoin = 'miter'
278        this.context.moveTo(30, 30)
279        this.context.lineTo(120, 60)
280        this.context.lineTo(30, 110)
281        this.context.stroke()
282      })
283    }
284    .width('100%')
285    .height('100%')
286  }
287}
288```
289
290![zh-cn_image_0000001194032454](figures/zh-cn_image_0000001194032454.png)
291
292
293### miterLimit
294
295```ts
296// xxx.ets
297@Entry
298@Component
299struct MiterLimit {
300  private settings: RenderingContextSettings = new RenderingContextSettings(true)
301  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
302
303  build() {
304    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
305      Canvas(this.context)
306        .width('100%')
307        .height('100%')
308        .backgroundColor('#ffff00')
309        .onReady(() =>{
310          this.context.lineWidth = 8
311          this.context.lineJoin = 'miter'
312          this.context.miterLimit = 3
313          this.context.moveTo(30, 30)
314          this.context.lineTo(60, 35)
315          this.context.lineTo(30, 37)
316          this.context.stroke()
317      })
318    }
319    .width('100%')
320    .height('100%')
321  }
322}
323```
324
325![zh-cn_image_0000001239032409](figures/zh-cn_image_0000001239032409.png)
326
327
328### font
329
330使用font属性加载自定义字体前,必须在src/main/ets/entryability/目录下的EntryAbility.ets中先注册自定义字体,参考如下代码:
331
332> familyName必须设置为不带空格的连续字符串(例如:"customFont"),否则font属性将无法加载自定义字体;
333>
334> familySrc中的font文件夹与pages文件夹在同一目录下。
335
336```ts
337onWindowStageCreate(windowStage: window.WindowStage): void {
338  windowStage.loadContent('pages/Index', (err) => {
339    windowStage.getMainWindow().then(res => {
340      const uiCtc = res.getUIContext()
341      uiCtc.getFont().registerFont({
342        familyName: 'customFont',
343        familySrc: '/font/myFont.ttf'
344      })
345    })
346  });
347}
348```
349
350```ts
351// xxx.ets
352@Entry
353@Component
354struct Fonts {
355  private settings: RenderingContextSettings = new RenderingContextSettings(true)
356  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
357
358  build() {
359    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
360      Canvas(this.context)
361        .width('100%')
362        .height('100%')
363        .backgroundColor('rgb(213,213,213)')
364        .onReady(() =>{
365          this.context.font = '30px sans-serif'
366          this.context.fillText("Hello px", 20, 60)
367          this.context.font = '30vp sans-serif'
368          this.context.fillText("Hello vp", 20, 100)
369          // font属性的font-family可以指定被注册的自定义字体的familyName,从而加载自定义字体
370          this.context.font = '30vp customFont'
371          this.context.fillText("Hello 自定义字体", 20, 140)
372        })
373    }
374    .width('100%')
375    .height('100%')
376  }
377}
378```
379
380![new_font](figures/new_font.jpeg)
381
382### textAlign
383
384```ts
385// xxx.ets
386@Entry
387@Component
388struct CanvasExample {
389  private settings: RenderingContextSettings = new RenderingContextSettings(true)
390  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
391
392  build() {
393    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
394      Canvas(this.context)
395        .width('100%')
396        .height('100%')
397        .backgroundColor('#ffff00')
398        .onReady(() => {
399          this.context.strokeStyle = '#0000ff'
400          this.context.moveTo(140, 10)
401          this.context.lineTo(140, 160)
402          this.context.stroke()
403          this.context.font = '18px sans-serif'
404          this.context.textAlign = 'start'
405          this.context.fillText('textAlign=start', 140, 60)
406          this.context.textAlign = 'end'
407          this.context.fillText('textAlign=end', 140, 80)
408          this.context.textAlign = 'left'
409          this.context.fillText('textAlign=left', 140, 100)
410          this.context.textAlign = 'center'
411          this.context.fillText('textAlign=center', 140, 120)
412          this.context.textAlign = 'right'
413          this.context.fillText('textAlign=right', 140, 140)
414        })
415    }
416    .width('100%')
417    .height('100%')
418  }
419}
420```
421
422![zh-cn_image_0000001238832385](figures/zh-cn_image_0000001238832385.png)
423
424
425### textBaseline
426
427```ts
428// xxx.ets
429@Entry
430@Component
431struct TextBaseline {
432  private settings: RenderingContextSettings = new RenderingContextSettings(true)
433  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
434
435  build() {
436    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
437      Canvas(this.context)
438        .width('100%')
439        .height('100%')
440        .backgroundColor('rgb(213,213,213)')
441        .onReady(() => {
442          this.context.strokeStyle = 'rgb(213,213,213)'
443          this.context.moveTo(0, 120)
444          this.context.lineTo(400, 120)
445          this.context.stroke()
446          this.context.font = '20px sans-serif'
447          this.context.textBaseline = 'top'
448          this.context.fillText('Top', 10, 120)
449          this.context.textBaseline = 'bottom'
450          this.context.fillText('Bottom', 55, 120)
451          this.context.textBaseline = 'middle'
452          this.context.fillText('Middle', 125, 120)
453          this.context.textBaseline = 'alphabetic'
454          this.context.fillText('Alphabetic', 195, 120)
455          this.context.textBaseline = 'hanging'
456          this.context.fillText('Hanging', 295, 120)
457      })
458    }
459    .width('100%')
460    .height('100%')
461  }
462}
463```
464
465![textBaseline](figures/textBaseline.jpg)
466
467
468### globalAlpha
469
470```ts
471// xxx.ets
472@Entry
473@Component
474struct GlobalAlpha {
475  private settings: RenderingContextSettings = new RenderingContextSettings(true)
476  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
477
478  build() {
479    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
480      Canvas(this.context)
481        .width('100%')
482        .height('100%')
483        .backgroundColor('#ffff00')
484        .onReady(() =>{
485          this.context.fillStyle = 'rgb(0,0,255)'
486          this.context.fillRect(0, 0, 50, 50)
487          this.context.globalAlpha = 0.4
488          this.context.fillStyle = 'rgb(0,0,255)'
489          this.context.fillRect(50, 50, 50, 50)
490      })
491    }
492    .width('100%')
493    .height('100%')
494  }
495}
496```
497
498![zh-cn_image_0000001194192434](figures/zh-cn_image_0000001194192434.png)
499
500
501### lineDashOffset
502
503```ts
504// xxx.ets
505@Entry
506@Component
507struct LineDashOffset {
508  private settings: RenderingContextSettings = new RenderingContextSettings(true)
509  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
510
511  build() {
512    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
513      Canvas(this.context)
514        .width('100%')
515        .height('100%')
516        .backgroundColor('#ffff00')
517        .onReady(() =>{
518          this.context.arc(100, 75, 50, 0, 6.28)
519          this.context.setLineDash([10,20])
520          this.context.lineDashOffset = 10.0
521          this.context.stroke()
522      })
523    }
524    .width('100%')
525    .height('100%')
526  }
527}
528```
529
530![zh-cn_image_0000001194352434](figures/zh-cn_image_0000001194352434.png)
531
532
533### globalCompositeOperation
534
535| 名称               | 描述                       |
536| ---------------- | ------------------------ |
537| source-over      | 在现有绘制内容上显示新绘制内容,属于默认值。   |
538| source-atop      | 在现有绘制内容顶部显示新绘制内容。        |
539| source-in        | 在现有绘制内容中显示新绘制内容。         |
540| source-out       | 在现有绘制内容之外显示新绘制内容。        |
541| destination-over | 在新绘制内容上方显示现有绘制内容。        |
542| destination-atop | 在新绘制内容顶部显示现有绘制内容。        |
543| destination-in   | 在新绘制内容中显示现有绘制内容。         |
544| destination-out  | 在新绘制内容外显示现有绘制内容。         |
545| lighter          | 显示新绘制内容和现有绘制内容。          |
546| copy             | 显示新绘制内容而忽略现有绘制内容。        |
547| xor              | 使用异或操作对新绘制内容与现有绘制内容进行融合。 |
548
549```ts
550// xxx.ets
551@Entry
552@Component
553struct GlobalCompositeOperation {
554  private settings: RenderingContextSettings = new RenderingContextSettings(true)
555  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
556
557  build() {
558    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
559      Canvas(this.context)
560        .width('100%')
561        .height('100%')
562        .backgroundColor('#ffff00')
563        .onReady(() =>{
564          this.context.fillStyle = 'rgb(255,0,0)'
565          this.context.fillRect(20, 20, 50, 50)
566          this.context.globalCompositeOperation = 'source-over'
567          this.context.fillStyle = 'rgb(0,0,255)'
568          this.context.fillRect(50, 50, 50, 50)
569          this.context.fillStyle = 'rgb(255,0,0)'
570          this.context.fillRect(120, 20, 50, 50)
571          this.context.globalCompositeOperation = 'destination-over'
572          this.context.fillStyle = 'rgb(0,0,255)'
573          this.context.fillRect(150, 50, 50, 50)
574      })
575    }
576    .width('100%')
577    .height('100%')
578  }
579}
580```
581
582![zh-cn_image_0000001238952375](figures/zh-cn_image_0000001238952375.png)
583
584
585### shadowBlur
586
587```ts
588// xxx.ets
589@Entry
590@Component
591struct ShadowBlur {
592  private settings: RenderingContextSettings = new RenderingContextSettings(true)
593  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
594
595  build() {
596    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
597      Canvas(this.context)
598        .width('100%')
599        .height('100%')
600        .backgroundColor('#ffff00')
601        .onReady(() =>{
602          this.context.shadowBlur = 30
603          this.context.shadowColor = 'rgb(0,0,0)'
604          this.context.fillStyle = 'rgb(255,0,0)'
605          this.context.fillRect(20, 20, 100, 80)
606      })
607    }
608    .width('100%')
609    .height('100%')
610  }
611}
612```
613
614![zh-cn_image_0000001194032456](figures/zh-cn_image_0000001194032456.png)
615
616
617### shadowColor
618
619```ts
620// xxx.ets
621@Entry
622@Component
623struct ShadowColor {
624  private settings: RenderingContextSettings = new RenderingContextSettings(true)
625  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
626
627  build() {
628    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
629      Canvas(this.context)
630        .width('100%')
631        .height('100%')
632        .backgroundColor('#ffff00')
633        .onReady(() =>{
634          this.context.shadowBlur = 30
635          this.context.shadowColor = 'rgb(0,0,255)'
636          this.context.fillStyle = 'rgb(255,0,0)'
637          this.context.fillRect(30, 30, 100, 100)
638      })
639    }
640    .width('100%')
641    .height('100%')
642  }
643}
644```
645
646![zh-cn_image_0000001239032411](figures/zh-cn_image_0000001239032411.png)
647
648
649### shadowOffsetX
650
651```ts
652// xxx.ets
653@Entry
654@Component
655struct ShadowOffsetX {
656  private settings: RenderingContextSettings = new RenderingContextSettings(true)
657  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
658
659  build() {
660    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
661      Canvas(this.context)
662        .width('100%')
663        .height('100%')
664        .backgroundColor('#ffff00')
665        .onReady(() =>{
666          this.context.shadowBlur = 10
667          this.context.shadowOffsetX = 20
668          this.context.shadowColor = 'rgb(0,0,0)'
669          this.context.fillStyle = 'rgb(255,0,0)'
670          this.context.fillRect(20, 20, 100, 80)
671      })
672    }
673    .width('100%')
674    .height('100%')
675  }
676}
677```
678
679![zh-cn_image_0000001193872490](figures/zh-cn_image_0000001193872490.png)
680
681
682### shadowOffsetY
683
684```ts
685// xxx.ets
686@Entry
687@Component
688struct ShadowOffsetY {
689  private settings: RenderingContextSettings = new RenderingContextSettings(true)
690  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
691  build() {
692    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
693      Canvas(this.context)
694        .width('100%')
695        .height('100%')
696        .backgroundColor('#ffff00')
697        .onReady(() =>{
698          this.context.shadowBlur = 10
699          this.context.shadowOffsetY = 20
700          this.context.shadowColor = 'rgb(0,0,0)'
701          this.context.fillStyle = 'rgb(255,0,0)'
702          this.context.fillRect(30, 30, 100, 100)
703      })
704    }
705    .width('100%')
706    .height('100%')
707  }
708}
709```
710
711![zh-cn_image_0000001238832387](figures/zh-cn_image_0000001238832387.png)
712
713
714### imageSmoothingEnabled
715
716```ts
717// xxx.ets
718@Entry
719@Component
720struct ImageSmoothingEnabled {
721  private settings: RenderingContextSettings = new RenderingContextSettings(true)
722  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
723  private img:ImageBitmap = new ImageBitmap("common/images/icon.jpg")
724
725  build() {
726    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
727      Canvas(this.context)
728        .width('100%')
729        .height('100%')
730        .backgroundColor('#ffff00')
731        .onReady(() =>{
732          this.context.imageSmoothingEnabled = false
733          this.context.drawImage( this.img,0,0,400,200)
734      })
735    }
736    .width('100%')
737    .height('100%')
738  }
739}
740```
741
742![zh-cn_image_0000001238712415](figures/zh-cn_image_0000001238712415.png)
743
744
745### height
746
747```ts
748// xxx.ets
749@Entry
750@Component
751struct HeightExample {
752  private settings: RenderingContextSettings = new RenderingContextSettings(true)
753  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
754
755  build() {
756    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
757      Canvas(this.context)
758        .width(300)
759        .height(300)
760        .backgroundColor('#ffff00')
761        .onReady(() => {
762          let h = this.context.height
763          this.context.fillRect(0, 0, 300, h/2)
764        })
765    }
766    .width('100%')
767    .height('100%')
768  }
769}
770```
771
772![zh-cn_image_canvas_height](figures/zh-cn_image_canvas_height.png)
773
774
775### width
776
777```ts
778// xxx.ets
779@Entry
780@Component
781struct WidthExample {
782  private settings: RenderingContextSettings = new RenderingContextSettings(true)
783  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
784
785  build() {
786    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
787      Canvas(this.context)
788        .width(300)
789        .height(300)
790        .backgroundColor('#ffff00')
791        .onReady(() => {
792          let w = this.context.width
793          this.context.fillRect(0, 0, w/2, 300)
794        })
795    }
796    .width('100%')
797    .height('100%')
798  }
799}
800```
801
802![zh-cn_image_canvas_width](figures/zh-cn_image_canvas_width.png)
803
804
805### canvas<sup>13+</sup>
806
807```ts
808import { FrameNode } from '@kit.ArkUI'
809// xxx.ets
810@Entry
811@Component
812struct CanvasExample {
813  private settings: RenderingContextSettings = new RenderingContextSettings(true)
814  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
815  private text: string = ''
816
817  build() {
818    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
819      Canvas(this.context)
820        .width('100%')
821        .height('100%')
822        .backgroundColor('#ffff00')
823        .onReady(() => {
824          let node: FrameNode = this.context.canvas
825          node?.commonEvent.setOnVisibleAreaApproximateChange(
826            { ratios: [0, 1], expectedUpdateInterval: 10},
827            (isVisible: boolean, currentRatio: number) => {
828              if (!isVisible && currentRatio <= 0.0) {
829                this.text = 'Canvas is completely invisible.'
830              }
831              if (isVisible && currentRatio >= 1.0) {
832                this.text = 'Canvas is fully visible.'
833              }
834              this.context.reset()
835              this.context.font = '30vp sans-serif'
836              this.context.fillText(this.text, 50, 50)
837            }
838          )
839        })
840    }
841    .width('100%')
842    .height('100%')
843  }
844}
845```
846
847![zh-cn_image_canvas](figures/zh-cn_image_canvas.png)
848
849
850### imageSmoothingQuality
851
852```ts
853  // xxx.ets
854  @Entry
855  @Component
856  struct ImageSmoothingQualityDemo {
857    private settings: RenderingContextSettings = new RenderingContextSettings(true);
858    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
859    private img:ImageBitmap = new ImageBitmap("common/images/example.jpg");
860
861    build() {
862      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
863        Canvas(this.context)
864          .width('100%')
865          .height('100%')
866          .backgroundColor('#ffff00')
867          .onReady(() =>{
868            let ctx = this.context
869            ctx.imageSmoothingEnabled = true
870            ctx.imageSmoothingQuality = 'high'
871            ctx.drawImage(this.img, 0, 0, 400, 200)
872          })
873      }
874      .width('100%')
875      .height('100%')
876    }
877  }
878```
879
880![ImageSmoothingQualityDemo](figures/ImageSmoothingQualityDemo.jpeg)
881
882
883### direction
884
885```ts
886  // xxx.ets
887  @Entry
888  @Component
889  struct DirectionDemo {
890    private settings: RenderingContextSettings = new RenderingContextSettings(true);
891    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
892
893    build() {
894      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
895        Canvas(this.context)
896          .width('100%')
897          .height('100%')
898          .backgroundColor('#ffff00')
899          .onReady(() =>{
900            let ctx = this.context
901            ctx.font = '48px serif';
902            ctx.textAlign = 'start'
903            ctx.fillText("Hi ltr!", 200, 50);
904
905            ctx.direction = "rtl";
906            ctx.fillText("Hi rtl!", 200, 100);
907          })
908      }
909      .width('100%')
910      .height('100%')
911    }
912  }
913```
914
915![directionDemo](figures/directionDemo.jpeg)
916
917
918### filter
919
920```ts
921  // xxx.ets
922  @Entry
923  @Component
924  struct FilterDemo {
925    private settings: RenderingContextSettings = new RenderingContextSettings(true);
926    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
927    private img: ImageBitmap = new ImageBitmap("common/images/example.jpg");
928
929    build() {
930      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
931        Canvas(this.context)
932          .width('100%')
933          .height('100%')
934          .onReady(() => {
935            let ctx = this.context
936            let img = this.img
937
938            ctx.drawImage(img, 0, 0, 100, 100);
939
940            ctx.filter = 'grayscale(50%)';
941            ctx.drawImage(img, 100, 0, 100, 100);
942
943            ctx.filter = 'sepia(60%)';
944            ctx.drawImage(img, 200, 0, 100, 100);
945
946            ctx.filter = 'saturate(30%)';
947            ctx.drawImage(img, 0, 100, 100, 100);
948
949            ctx.filter = 'hue-rotate(90deg)';
950            ctx.drawImage(img, 100, 100, 100, 100);
951
952            ctx.filter = 'invert(100%)';
953            ctx.drawImage(img, 200, 100, 100, 100);
954
955            ctx.filter = 'opacity(25%)';
956            ctx.drawImage(img, 0, 200, 100, 100);
957
958            ctx.filter = 'brightness(0.4)';
959            ctx.drawImage(img, 100, 200, 100, 100);
960
961            ctx.filter = 'contrast(200%)';
962            ctx.drawImage(img, 200, 200, 100, 100);
963
964            ctx.filter = 'blur(5px)';
965            ctx.drawImage(img, 0, 300, 100, 100);
966
967            // Applying multiple filters
968            ctx.filter = 'opacity(50%) contrast(200%) grayscale(50%)';
969            ctx.drawImage(img, 100, 300, 100, 100);
970          })
971      }
972      .width('100%')
973      .height('100%')
974    }
975  }
976```
977
978![filterDemo](figures/filterDemo.jpeg)
979
980### letterSpacing<sup>18+</sup>
981
982```ts
983  // xxx.ets
984  import { LengthMetrics, LengthUnit } from '@kit.ArkUI'
985
986  @Entry
987  @Component
988  struct letterSpacingDemo {
989    private settings: RenderingContextSettings = new RenderingContextSettings(true)
990    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
991
992    build() {
993      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
994        Canvas(this.context)
995          .width('100%')
996          .height('100%')
997          .backgroundColor('rgb(213,213,213)')
998          .onReady(() => {
999            this.context.font = '30vp'
1000            this.context.letterSpacing = '10vp'
1001            this.context.fillText('hello world', 30, 50)
1002            this.context.letterSpacing = new LengthMetrics(10, LengthUnit.VP)
1003            this.context.fillText('hello world', 30, 100)
1004          })
1005      }
1006      .width('100%')
1007      .height('100%')
1008    }
1009  }
1010```
1011
1012![letterSpacingDemo](figures/letterSpacingDemo.jpeg)
1013
1014## 方法
1015
1016以下方法在隐藏页面中调用会产生缓存,应避免在隐藏页面中频繁刷新Canvas。
1017
1018### fillRect
1019
1020fillRect(x: number, y: number, w: number, h: number): void
1021
1022填充一个矩形。
1023
1024**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1025
1026**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1027
1028**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1029
1030**参数:**
1031
1032| 参数名     | 类型     | 必填 | 说明            |
1033| ------ | ------ | ---- | ------------- |
1034| x      | number | 是  | 指定矩形左上角点的x坐标。<br>默认单位:vp。 |
1035| y      | number | 是  | 指定矩形左上角点的y坐标。<br>默认单位:vp。 |
1036| w      | number | 是  | 指定矩形的宽度。<br>默认单位:vp。 |
1037| h      | number | 是  | 指定矩形的高度。<br>默认单位:vp。 |
1038
1039**示例:**
1040
1041  ```ts
1042  // xxx.ets
1043  @Entry
1044  @Component
1045  struct FillRect {
1046    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1047    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1048
1049    build() {
1050      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1051        Canvas(this.context)
1052          .width('100%')
1053          .height('100%')
1054          .backgroundColor('rgb(213,213,213)')
1055          .onReady(() => {
1056            this.context.fillRect(30, 30, 100, 100)
1057         })
1058        }
1059      .width('100%')
1060      .height('100%')
1061    }
1062  }
1063  ```
1064
1065  ![fillRect](figures/fillRect.jpg)
1066
1067
1068### strokeRect
1069
1070strokeRect(x: number, y: number, w: number, h: number): void
1071
1072绘制具有边框的矩形,矩形内部不填充。
1073
1074**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1075
1076**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1077
1078**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1079
1080**参数:**
1081
1082| 参数名   | 类型     | 必填   | 说明           |
1083| ---- | ------ | ----  | ------------ |
1084| x    | number | 是     | 指定矩形的左上角x坐标。<br>默认单位:vp。 |
1085| y    | number | 是     | 指定矩形的左上角y坐标。<br>默认单位:vp。 |
1086| w    | number | 是     | 指定矩形的宽度。<br>默认单位:vp。|
1087| h    | number | 是     | 指定矩形的高度。<br>默认单位:vp。|
1088
1089**示例:**
1090
1091  ```ts
1092  // xxx.ets
1093  @Entry
1094  @Component
1095  struct StrokeRect {
1096    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1097    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1098
1099    build() {
1100      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1101        Canvas(this.context)
1102          .width('100%')
1103          .height('100%')
1104          .backgroundColor('#ffff00')
1105          .onReady(() =>{
1106            this.context.strokeRect(30, 30, 200, 150)
1107        })
1108      }
1109      .width('100%')
1110      .height('100%')
1111    }
1112  }
1113  ```
1114
1115  ![zh-cn_image_0000001194352436](figures/zh-cn_image_0000001194352436.png)
1116
1117
1118### clearRect
1119
1120clearRect(x: number, y: number, w: number, h: number): void
1121
1122删除指定区域内的绘制内容。
1123
1124**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1125
1126**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1127
1128**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1129
1130**参数:**
1131
1132| 参数名   | 类型     | 必填  | 说明  |
1133| ---- | ------ | ---- | ------------- |
1134| x    | number | 是 | 指定矩形上的左上角x坐标。<br>默认单位:vp。 |
1135| y    | number | 是 | 指定矩形上的左上角y坐标。<br>默认单位:vp。 |
1136| w    | number | 是 | 指定矩形的宽度。<br>默认单位:vp。 |
1137| h    | number | 是 | 指定矩形的高度。<br>默认单位:vp。 |
1138
1139**示例:**
1140
1141  ```ts
1142  // xxx.ets
1143  @Entry
1144  @Component
1145  struct ClearRect {
1146    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1147    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1148
1149    build() {
1150      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1151        Canvas(this.context)
1152          .width('100%')
1153          .height('100%')
1154          .backgroundColor('#ffff00')
1155          .onReady(() =>{
1156            this.context.fillStyle = 'rgb(0,0,255)'
1157            this.context.fillRect(20,20,200,200)
1158            this.context.clearRect(30,30,150,100)
1159        })
1160      }
1161      .width('100%')
1162      .height('100%')
1163    }
1164  }
1165  ```
1166
1167  ![zh-cn_image_0000001238952377](figures/zh-cn_image_0000001238952377.png)
1168
1169
1170### fillText
1171
1172fillText(text: string, x: number, y: number, maxWidth?: number): void
1173
1174绘制填充类文本。
1175
1176**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1177
1178**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1179
1180**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1181
1182**参数:**
1183
1184| 参数名       | 类型     | 必填   | 说明 |
1185| -------- | ------ | ---- | --------------- |
1186| text     | string | 是    | 需要绘制的文本内容。 |
1187| x        | number | 是    | 需要绘制的文本的左下角x坐标。<br>默认单位:vp。 |
1188| y        | number | 是    | 需要绘制的文本的左下角y坐标。<br>默认单位:vp。 |
1189| maxWidth | number | 否    | 指定文本允许的最大宽度。<br>默认单位:vp。<br>默认值:不限制宽度。 |
1190
1191**示例:**
1192
1193  ```ts
1194  // xxx.ets
1195  @Entry
1196  @Component
1197  struct FillText {
1198    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1199    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1200
1201    build() {
1202      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1203        Canvas(this.context)
1204          .width('100%')
1205          .height('100%')
1206          .backgroundColor('#ffff00')
1207          .onReady(() =>{
1208            this.context.font = '30px sans-serif'
1209            this.context.fillText("Hello World!", 20, 100)
1210        })
1211      }
1212      .width('100%')
1213      .height('100%')
1214    }
1215  }
1216  ```
1217
1218  ![zh-cn_image_0000001194032458](figures/zh-cn_image_0000001194032458.png)
1219
1220
1221### strokeText
1222
1223strokeText(text: string, x: number, y: number, maxWidth?: number): void
1224
1225绘制描边类文本。
1226
1227**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1228
1229**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1230
1231**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1232
1233**参数:**
1234
1235| 参数名       | 类型     | 必填 | 说明     |
1236| -------- | ------ | ---- | --------------- |
1237| text     | string | 是    | 需要绘制的文本内容。 |
1238| x        | number | 是    | 需要绘制的文本的左下角x坐标。<br>默认单位:vp。 |
1239| y        | number | 是    | 需要绘制的文本的左下角y坐标。<br>默认单位:vp。 |
1240| maxWidth | number | 否    | 需要绘制的文本的最大宽度。<br>默认单位:vp。<br>默认值:不限制宽度。 |
1241
1242**示例:**
1243
1244  ```ts
1245  // xxx.ets
1246  @Entry
1247  @Component
1248  struct StrokeText {
1249    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1250    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1251
1252    build() {
1253      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1254        Canvas(this.context)
1255          .width('100%')
1256          .height('100%')
1257          .backgroundColor('rgb(213,213,213)')
1258          .onReady(() => {
1259            this.context.font = '50vp sans-serif'
1260            this.context.strokeText("Hello World!", 20, 60)
1261        })
1262      }
1263      .width('100%')
1264      .height('100%')
1265    }
1266  }
1267  ```
1268
1269  ![strokeText](figures/strokeText.jpg)
1270
1271
1272### measureText
1273
1274measureText(text: string): TextMetrics
1275
1276该方法返回一个文本测算的对象,通过该对象可以获取指定文本的宽度值。不同设备上获取的宽度值可能不同。
1277
1278**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1279
1280**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1281
1282**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1283
1284**参数:**
1285
1286| 参数名   | 类型     | 必填   | 说明         |
1287| ---- | ------ | ---- |---------- |
1288| text | string | 是  | 需要进行测量的文本。 |
1289
1290**返回值:**
1291
1292| 类型          | 说明                                       |
1293| ----------- | ---------------------------------------- |
1294| [TextMetrics](#textmetrics) | 文本的尺寸信息。 |
1295
1296**示例:**
1297
1298  ```ts
1299  // xxx.ets
1300  @Entry
1301  @Component
1302  struct MeasureText {
1303    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1304    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1305
1306    build() {
1307      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1308        Canvas(this.context)
1309          .width('100%')
1310          .height('100%')
1311          .backgroundColor('rgb(213,213,213)')
1312          .onReady(() => {
1313            this.context.font = '50px sans-serif'
1314            this.context.fillText("Hello World!", 20, 100)
1315            this.context.fillText("width:" + this.context.measureText("Hello World!").width, 20, 200)
1316        })
1317      }
1318      .width('100%')
1319      .height('100%')
1320    }
1321  }
1322  ```
1323
1324  ![measureText](figures/measureText.jpg)
1325
1326
1327### stroke
1328
1329stroke(): void
1330
1331根据当前的路径,进行边框绘制操作。
1332
1333**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1334
1335**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1336
1337**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1338
1339 **示例:**
1340
1341  ```ts
1342  // xxx.ets
1343  @Entry
1344  @Component
1345  struct Stroke {
1346    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1347    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1348
1349    build() {
1350      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1351        Canvas(this.context)
1352          .width('100%')
1353          .height('100%')
1354          .backgroundColor('#ffff00')
1355          .onReady(() => {
1356            this.context.moveTo(125, 25)
1357            this.context.lineTo(125, 105)
1358            this.context.lineTo(175, 105)
1359            this.context.lineTo(175, 25)
1360            this.context.strokeStyle = 'rgb(255,0,0)'
1361            this.context.stroke()
1362          })
1363      }
1364      .width('100%')
1365      .height('100%')
1366    }
1367  }
1368  ```
1369
1370  ![zh-cn_image_0000001238832389](figures/zh-cn_image_0000001238832389.png)
1371
1372### stroke
1373
1374stroke(path: Path2D): void
1375
1376根据指定的路径,进行边框绘制操作。
1377
1378**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1379
1380**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1381
1382**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1383
1384**参数:**
1385
1386| 参数名   | 类型      | 必填   | 说明     |
1387| ---- | ---------------------------------------- | ---- | ------------ |
1388| path | [Path2D](ts-components-canvas-path2d.md) | 是 | 需要绘制的Path2D。 |
1389
1390 **示例:**
1391
1392  ```ts
1393  // xxx.ets
1394  @Entry
1395  @Component
1396  struct Stroke {
1397    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1398    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1399    private path2Da: Path2D = new Path2D()
1400
1401    build() {
1402      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1403        Canvas(this.context)
1404          .width('100%')
1405          .height('100%')
1406          .backgroundColor('#ffff00')
1407          .onReady(() => {
1408            this.path2Da.moveTo(25, 25)
1409            this.path2Da.lineTo(25, 105)
1410            this.path2Da.lineTo(75, 105)
1411            this.path2Da.lineTo(75, 25)
1412            this.context.strokeStyle = 'rgb(0,0,255)'
1413            this.context.stroke(this.path2Da)
1414          })
1415      }
1416      .width('100%')
1417      .height('100%')
1418    }
1419  }
1420  ```
1421
1422  ![zh-cn_image_0000001238832389](figures/zh-cn_image_0000001238832390.png)
1423
1424### beginPath
1425
1426beginPath(): void
1427
1428创建一个新的绘制路径。
1429
1430**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1431
1432**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1433
1434**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1435
1436**示例:**
1437
1438  ```ts
1439  // xxx.ets
1440  @Entry
1441  @Component
1442  struct BeginPath {
1443    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1444    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1445
1446    build() {
1447      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1448        Canvas(this.context)
1449          .width('100%')
1450          .height('100%')
1451          .backgroundColor('#ffff00')
1452          .onReady(() =>{
1453            this.context.beginPath()
1454            this.context.lineWidth = 6
1455            this.context.strokeStyle = '#0000ff'
1456            this.context.moveTo(15, 80)
1457            this.context.lineTo(280, 160)
1458            this.context.stroke()
1459          })
1460      }
1461      .width('100%')
1462      .height('100%')
1463    }
1464  }
1465  ```
1466
1467  ![zh-cn_image_0000001238712417](figures/zh-cn_image_0000001238712417.png)
1468
1469
1470### moveTo
1471
1472moveTo(x: number, y: number): void
1473
1474路径从当前点移动到指定点。
1475
1476**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1477
1478**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1479
1480**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1481
1482**参数:**
1483
1484| 参数名   | 类型     | 必填   | 说明        |
1485| ---- | ------ | ---- | --------- |
1486| x    | number | 是    | 指定位置的x坐标。<br>默认单位:vp。 |
1487| y    | number | 是    | 指定位置的y坐标。<br>默认单位:vp。 |
1488
1489**示例:**
1490
1491  ```ts
1492  // xxx.ets
1493  @Entry
1494  @Component
1495  struct MoveTo {
1496    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1497    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1498
1499    build() {
1500      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1501        Canvas(this.context)
1502          .width('100%')
1503          .height('100%')
1504          .backgroundColor('#ffff00')
1505          .onReady(() =>{
1506            this.context.beginPath()
1507            this.context.moveTo(10, 10)
1508            this.context.lineTo(280, 160)
1509            this.context.stroke()
1510          })
1511      }
1512      .width('100%')
1513      .height('100%')
1514    }
1515  }
1516  ```
1517
1518  ![zh-cn_image_0000001194192438](figures/zh-cn_image_0000001194192438.png)
1519
1520
1521### lineTo
1522
1523lineTo(x: number, y: number): void
1524
1525从当前点到指定点进行路径连接。
1526
1527**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1528
1529**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1530
1531**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1532
1533**参数:**
1534
1535| 参数名   | 类型     | 必填   | 说明        |
1536| ---- | ------ | ---- | --------- |
1537| x    | number | 是    | 指定位置的x坐标。<br>默认单位:vp。 |
1538| y    | number | 是    | 指定位置的y坐标。<br>默认单位:vp。 |
1539
1540**示例:**
1541
1542  ```ts
1543  // xxx.ets
1544  @Entry
1545  @Component
1546  struct LineTo {
1547    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1548    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1549
1550    build() {
1551      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1552        Canvas(this.context)
1553          .width('100%')
1554          .height('100%')
1555          .backgroundColor('#ffff00')
1556          .onReady(() =>{
1557            this.context.beginPath()
1558            this.context.moveTo(10, 10)
1559            this.context.lineTo(280, 160)
1560            this.context.stroke()
1561          })
1562      }
1563      .width('100%')
1564      .height('100%')
1565    }
1566  }
1567  ```
1568
1569  ![zh-cn_image_0000001194352438](figures/zh-cn_image_0000001194352438.png)
1570
1571
1572### closePath
1573
1574closePath(): void
1575
1576结束当前路径形成一个封闭路径。
1577
1578**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1579
1580**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1581
1582**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1583
1584**示例:**
1585
1586  ```ts
1587  // xxx.ets
1588  @Entry
1589  @Component
1590  struct ClosePath {
1591    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1592    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1593
1594    build() {
1595      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1596        Canvas(this.context)
1597          .width('100%')
1598          .height('100%')
1599          .backgroundColor('#ffff00')
1600          .onReady(() =>{
1601              this.context.beginPath()
1602              this.context.moveTo(30, 30)
1603              this.context.lineTo(110, 30)
1604              this.context.lineTo(70, 90)
1605              this.context.closePath()
1606              this.context.stroke()
1607          })
1608      }
1609      .width('100%')
1610      .height('100%')
1611    }
1612  }
1613  ```
1614
1615  ![zh-cn_image_0000001238952379](figures/zh-cn_image_0000001238952379.png)
1616
1617
1618### createPattern
1619
1620createPattern(image: ImageBitmap, repetition: string | null): CanvasPattern | null
1621
1622通过指定图像和重复方式创建图片填充的模板。
1623
1624**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1625
1626**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1627
1628**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1629
1630**参数:**
1631
1632| 参数名  | 类型  | 必填  | 说明  |
1633| ---------- | ---------- | ---- | ---------------------------------------- |
1634| image  | [ImageBitmap](ts-components-canvas-imagebitmap.md) | 是  | 图源对象,具体参考ImageBitmap对象。 |
1635| repetition | string \| null  | 是  | 设置图像重复的方式:<br>'repeat':沿x轴和y轴重复绘制图像;<br>'repeat-x':沿x轴重复绘制图像;<br>'repeat-y':沿y轴重复绘制图像;<br>'no-repeat':不重复绘制图像;<br>'clamp':在原始边界外绘制时,超出部分使用边缘的颜色绘制;<br>'mirror':沿x轴和y轴重复翻转绘制图像。 |
1636
1637**返回值:**
1638
1639| 类型                                       | 说明                      |
1640| ---------------------------------------- | ----------------------- |
1641| [CanvasPattern](ts-components-canvas-canvaspattern.md#canvaspattern) \| null | 通过指定图像和重复方式创建图片填充的模板对象。 |
1642
1643**示例:**
1644
1645  ```ts
1646  // xxx.ets
1647  @Entry
1648  @Component
1649  struct CreatePattern {
1650    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1651    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1652    private img:ImageBitmap = new ImageBitmap("common/images/icon.jpg")
1653
1654    build() {
1655      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1656        Canvas(this.context)
1657          .width('100%')
1658          .height('100%')
1659          .backgroundColor('#ffff00')
1660          .onReady(() =>{
1661            let pattern = this.context.createPattern(this.img, 'repeat')
1662            if (pattern) {
1663              this.context.fillStyle = pattern
1664            }
1665            this.context.fillRect(0, 0, 200, 200)
1666          })
1667      }
1668      .width('100%')
1669      .height('100%')
1670    }
1671  }
1672  ```
1673
1674  ![zh-cn_image_0000001194032460](figures/zh-cn_image_0000001194032460.png)
1675
1676
1677### bezierCurveTo
1678
1679bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void
1680
1681创建三次贝赛尔曲线的路径。
1682
1683**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1684
1685**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1686
1687**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1688
1689**参数:**
1690
1691| 参数名   | 类型     | 必填   | 说明  |
1692| ---- | ------ | ---- | -------------- |
1693| cp1x | number | 是  | 第一个贝塞尔参数的x坐标值。<br>默认单位:vp。 |
1694| cp1y | number | 是  | 第一个贝塞尔参数的y坐标值。<br>默认单位:vp。 |
1695| cp2x | number | 是  | 第二个贝塞尔参数的x坐标值。<br>默认单位:vp。 |
1696| cp2y | number | 是  | 第二个贝塞尔参数的y坐标值。<br>默认单位:vp。 |
1697| x    | number | 是  | 路径结束时的x坐标值。<br>默认单位:vp。 |
1698| y    | number | 是  | 路径结束时的y坐标值。<br>默认单位:vp。 |
1699
1700**示例:**
1701
1702  ```ts
1703  // xxx.ets
1704  @Entry
1705  @Component
1706  struct BezierCurveTo {
1707    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1708    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1709
1710    build() {
1711      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1712        Canvas(this.context)
1713          .width('100%')
1714          .height('100%')
1715          .backgroundColor('#ffff00')
1716          .onReady(() =>{
1717            this.context.beginPath()
1718            this.context.moveTo(10, 10)
1719            this.context.bezierCurveTo(20, 100, 200, 100, 200, 20)
1720            this.context.stroke()
1721          })
1722      }
1723      .width('100%')
1724      .height('100%')
1725    }
1726  }
1727  ```
1728
1729  ![zh-cn_image_0000001239032415](figures/zh-cn_image_0000001239032415.png)
1730
1731
1732### quadraticCurveTo
1733
1734quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void
1735
1736创建二次贝赛尔曲线的路径。
1737
1738**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1739
1740**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1741
1742**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1743
1744**参数:**
1745
1746| 参数名   | 类型     | 必填   | 说明          |
1747| ---- | ------ | ---- | ----------- |
1748| cpx  | number | 是    | 贝塞尔参数的x坐标值。<br>默认单位:vp。 |
1749| cpy  | number | 是    | 贝塞尔参数的y坐标值。<br>默认单位:vp。 |
1750| x    | number | 是    | 路径结束时的x坐标值。<br>默认单位:vp。 |
1751| y    | number | 是    | 路径结束时的y坐标值。<br>默认单位:vp。 |
1752
1753**示例:**
1754
1755  ```ts
1756  // xxx.ets
1757  @Entry
1758  @Component
1759  struct QuadraticCurveTo {
1760    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1761    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1762
1763    build() {
1764      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1765        Canvas(this.context)
1766          .width('100%')
1767          .height('100%')
1768          .backgroundColor('#ffff00')
1769          .onReady(() =>{
1770            this.context.beginPath()
1771            this.context.moveTo(20, 20)
1772            this.context.quadraticCurveTo(100, 100, 200, 20)
1773            this.context.stroke()
1774        })
1775      }
1776      .width('100%')
1777      .height('100%')
1778    }
1779  }
1780  ```
1781
1782  ![zh-cn_image_0000001193872494](figures/zh-cn_image_0000001193872494.png)
1783
1784
1785### arc
1786
1787arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void
1788
1789绘制弧线路径。
1790
1791**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1792
1793**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1794
1795**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1796
1797**参数:**
1798
1799| 参数名       | 类型      | 必填   | 说明         |
1800| ---------------- | ------- | ---- | ---------- |
1801| x                | number  | 是  | 弧线圆心的x坐标值。<br>默认单位:vp。 |
1802| y                | number  | 是  | 弧线圆心的y坐标值。<br>默认单位:vp。 |
1803| radius           | number  | 是  | 弧线的圆半径。<br>默认单位:vp。 |
1804| startAngle       | number  | 是  | 弧线的起始弧度。<br>单位:弧度 |
1805| endAngle         | number  | 是  | 弧线的终止弧度。<br>单位:弧度 |
1806| counterclockwise | boolean | 否  | 是否逆时针绘制圆弧。<br>true:逆时针方向绘制圆弧。<br>false:顺时针方向绘制圆弧。<br>默认值:false。 |
1807
1808**示例:**
1809
1810  ```ts
1811  // xxx.ets
1812  @Entry
1813  @Component
1814  struct Arc {
1815    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1816    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1817
1818    build() {
1819      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1820        Canvas(this.context)
1821          .width('100%')
1822          .height('100%')
1823          .backgroundColor('#ffff00')
1824          .onReady(() =>{
1825            this.context.beginPath()
1826            this.context.arc(100, 75, 50, 0, 6.28)
1827            this.context.stroke()
1828          })
1829      }
1830      .width('100%')
1831      .height('100%')
1832    }
1833  }
1834  ```
1835
1836  ![zh-cn_image_0000001238832391](figures/zh-cn_image_0000001238832391.jpeg)
1837
1838
1839### arcTo
1840
1841arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void
1842
1843依据给定的控制点和圆弧半径创建圆弧路径。
1844
1845**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1846
1847**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1848
1849**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1850
1851**参数:**
1852
1853| 参数名     | 类型     | 必填   | 说明          |
1854| ------ | ------ | ---- | --------------- |
1855| x1     | number | 是    | 第一个控制点的x坐标值。<br>默认单位:vp。 |
1856| y1     | number | 是    | 第一个控制点的y坐标值。<br>默认单位:vp。 |
1857| x2     | number | 是    | 第二个控制点的x坐标值。<br>默认单位:vp。 |
1858| y2     | number | 是    | 第二个控制点的y坐标值。<br>默认单位:vp。 |
1859| radius | number | 是    | 圆弧的圆半径值。<br>默认单位:vp。 |
1860
1861**示例:**
1862
1863  ```ts
1864  // xxx.ets
1865  @Entry
1866  @Component
1867  struct ArcTo {
1868    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1869    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1870
1871    build() {
1872      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1873        Canvas(this.context)
1874          .width('100%')
1875          .height('100%')
1876          .backgroundColor('#ffff00')
1877          .onReady(() =>{
1878            // 切线
1879            this.context.beginPath()
1880            this.context.strokeStyle = '#808080'
1881            this.context.lineWidth = 1.5;
1882            this.context.moveTo(360, 20);
1883            this.context.lineTo(360, 170);
1884            this.context.lineTo(110, 170);
1885            this.context.stroke();
1886
1887            // 圆弧
1888            this.context.beginPath()
1889            this.context.strokeStyle = '#000000'
1890            this.context.lineWidth = 3;
1891            this.context.moveTo(360, 20)
1892            this.context.arcTo(360, 170, 110, 170, 150)
1893            this.context.stroke()
1894
1895            // 起始点
1896            this.context.beginPath();
1897            this.context.fillStyle = '#00ff00';
1898            this.context.arc(360, 20, 4, 0, 2 * Math.PI);
1899            this.context.fill();
1900
1901            // 控制点
1902            this.context.beginPath();
1903            this.context.fillStyle = '#ff0000';
1904            this.context.arc(360, 170, 4, 0, 2 * Math.PI);
1905            this.context.arc(110, 170, 4, 0, 2 * Math.PI);
1906            this.context.fill();
1907          })
1908      }
1909      .width('100%')
1910      .height('100%')
1911    }
1912  }
1913  ```
1914
1915  ![zh-cn_image_0000001238712419](figures/zh-cn_image_0000001238712419.png)
1916
1917  > 此示例中,arcTo()创建的圆弧为黑色,圆弧的两条切线为灰色。控制点为红色,起始点为绿色。
1918  >
1919  > 可以想象两条切线:一条切线从起始点到第一个控制点,另一条切线从第一个控制点到第二个控制点。arcTo()在这两条切线间创建一个圆弧,并使圆弧与这两条切线都相切。
1920
1921
1922### ellipse
1923
1924ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void
1925
1926在规定的矩形区域绘制一个椭圆。
1927
1928**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1929
1930**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1931
1932**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1933
1934**参数:**
1935
1936| 参数名               | 类型      | 必填   | 说明                                       |
1937| ---------------- | ------- | ---- | ---------------------------------------- |
1938| x                | number  | 是 | 椭圆圆心的x轴坐标。<br>默认单位:vp。 |
1939| y                | number  | 是 | 椭圆圆心的y轴坐标。<br>默认单位:vp。 |
1940| radiusX          | number  | 是 | 椭圆x轴的半径长度。<br>默认单位:vp。 |
1941| radiusY          | number  | 是 | 椭圆y轴的半径长度。<br>默认单位:vp。 |
1942| rotation         | number  | 是 | 椭圆的旋转角度。<br>单位:弧度。 |
1943| startAngle       | number  | 是 | 椭圆绘制的起始点角度。<br>单位:弧度。 |
1944| endAngle         | number  | 是 | 椭圆绘制的结束点角度。<br>单位:弧度。 |
1945| counterclockwise | boolean | 否 | 是否以逆时针方向绘制椭圆。<br>true:逆时针方向绘制椭圆。<br>false:顺时针方向绘制椭圆。<br>默认值:false。 |
1946
1947**示例:**
1948
1949  ```ts
1950  // xxx.ets
1951  @Entry
1952  @Component
1953  struct CanvasExample {
1954    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1955    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1956
1957    build() {
1958      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1959        Canvas(this.context)
1960          .width('100%')
1961          .height('100%')
1962          .backgroundColor('#ffff00')
1963          .onReady(() =>{
1964            this.context.beginPath()
1965            this.context.ellipse(200, 200, 50, 100, Math.PI * 0.25, Math.PI * 0.5, Math.PI * 2, false)
1966            this.context.stroke()
1967            this.context.beginPath()
1968            this.context.ellipse(200, 300, 50, 100, Math.PI * 0.25, Math.PI * 0.5, Math.PI * 2, true)
1969            this.context.stroke()
1970          })
1971      }
1972      .width('100%')
1973      .height('100%')
1974    }
1975  }
1976  ```
1977
1978  ![zh-cn_image_0000001194192440](figures/zh-cn_image_0000001194192440.jpeg)
1979
1980
1981### rect
1982
1983rect(x: number, y: number, w: number, h: number): void
1984
1985创建矩形路径。
1986
1987**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
1988
1989**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1990
1991**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1992
1993**参数:**
1994
1995| 参数名   | 类型     | 必填   | 说明            |
1996| ---- | ------ | ---- | ------------- |
1997| x    | number | 是    | 指定矩形的左上角x坐标值。<br>默认单位:vp。 |
1998| y    | number | 是    | 指定矩形的左上角y坐标值。<br>默认单位:vp。 |
1999| w    | number | 是    | 指定矩形的宽度。<br>默认单位:vp。 |
2000| h    | number | 是    | 指定矩形的高度。<br>默认单位:vp。 |
2001
2002**示例:**
2003
2004  ```ts
2005  // xxx.ets
2006  @Entry
2007  @Component
2008  struct CanvasExample {
2009    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2010    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2011
2012    build() {
2013      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2014        Canvas(this.context)
2015          .width('100%')
2016          .height('100%')
2017          .backgroundColor('#ffff00')
2018          .onReady(() =>{
2019            this.context.rect(20, 20, 100, 100) // Create a 100*100 rectangle at (20, 20)
2020            this.context.stroke()
2021          })
2022      }
2023      .width('100%')
2024      .height('100%')
2025    }
2026  }
2027  ```
2028
2029  ![zh-cn_image_0000001194352440](figures/zh-cn_image_0000001194352440.jpeg)
2030
2031
2032### fill
2033
2034fill(fillRule?: CanvasFillRule): void
2035
2036对封闭路径进行填充。
2037
2038**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
2039
2040**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2041
2042**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2043
2044**参数:**
2045
2046| 参数名 | 类型             | 必填   | 说明    |
2047| -------- | -------------- | ---- | ---------------------------------------- |
2048| fillRule | [CanvasFillRule](#canvasfillrule类型说明) | 否    | 指定要填充对象的规则。<br/>可选参数为:"nonzero", "evenodd"。<br>默认值:"nonzero"。 |
2049
2050
2051**示例:**
2052
2053  ```ts
2054  // xxx.ets
2055  @Entry
2056  @Component
2057  struct Fill {
2058    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2059    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2060
2061    build() {
2062      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2063        Canvas(this.context)
2064          .width('100%')
2065          .height('100%')
2066          .backgroundColor('#ffff00')
2067          .onReady(() =>{
2068            this.context.rect(20, 20, 100, 100) // Create a 100*100 rectangle at (20, 20)
2069            this.context.fill()
2070          })
2071      }
2072      .width('100%')
2073      .height('100%')
2074    }
2075  }
2076  ```
2077
2078  ![zh-cn_image_0000001238952381](figures/zh-cn_image_0000001238952381.png)
2079
2080
2081fill(path: Path2D, fillRule?: CanvasFillRule): void
2082
2083对封闭路径进行填充。
2084
2085**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
2086
2087**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2088
2089**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2090
2091**参数:**
2092
2093| 参数名    | 类型             | 必填   | 说明  |
2094| -------- | -------------- | ---- | ---------------------------------------- |
2095| path     | [Path2D](ts-components-canvas-path2d.md)         | 是  | Path2D填充路径。                              |
2096| fillRule | [CanvasFillRule](#canvasfillrule类型说明) | 否    | 指定要填充对象的规则。<br/>可选参数为:"nonzero", "evenodd"。<br>默认值:"nonzero"。 |
2097
2098
2099**示例:**
2100
2101```ts
2102// xxx.ets
2103@Entry
2104@Component
2105struct Fill {
2106  private settings: RenderingContextSettings = new RenderingContextSettings(true)
2107  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2108
2109  build() {
2110    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2111      Canvas(this.context)
2112        .width('100%')
2113        .height('100%')
2114        .backgroundColor('#ffff00')
2115        .onReady(() =>{
2116          let region = new Path2D()
2117          region.moveTo(30, 90)
2118          region.lineTo(110, 20)
2119          region.lineTo(240, 130)
2120          region.lineTo(60, 130)
2121          region.lineTo(190, 20)
2122          region.lineTo(270, 90)
2123          region.closePath()
2124          // Fill path
2125          this.context.fillStyle = '#00ff00'
2126          this.context.fill(region, "evenodd")
2127        })
2128    }
2129    .width('100%')
2130    .height('100%')
2131  }
2132}
2133```
2134
2135 ![zh-cn_image_000000127777774](figures/zh-cn_image_000000127777774.jpg)
2136
2137
2138### clip
2139
2140clip(fillRule?: CanvasFillRule): void
2141
2142设置当前路径为剪切路径。
2143
2144**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
2145
2146**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2147
2148**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2149
2150**参数:**
2151
2152| 参数名       | 类型             | 必填   | 说明                            |
2153| -------- | -------------- | ---- | ---------------------------------------- |
2154| fillRule | [CanvasFillRule](#canvasfillrule类型说明) | 否 | 指定要剪切对象的规则。<br/>可选参数为:"nonzero", "evenodd"。 <br>默认值:"nonzero"。 |
2155
2156**示例:**
2157
2158  ```ts
2159  // xxx.ets
2160  @Entry
2161  @Component
2162  struct Clip {
2163    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2164    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2165
2166    build() {
2167      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2168        Canvas(this.context)
2169          .width('100%')
2170          .height('100%')
2171          .backgroundColor('#ffff00')
2172          .onReady(() =>{
2173            this.context.rect(0, 0, 100, 200)
2174            this.context.stroke()
2175            this.context.clip()
2176            this.context.fillStyle = "rgb(255,0,0)"
2177            this.context.fillRect(0, 0, 200, 200)
2178          })
2179      }
2180      .width('100%')
2181      .height('100%')
2182    }
2183  }
2184  ```
2185
2186  ![zh-cn_image_0000001194032462](figures/zh-cn_image_0000001194032462.png)
2187
2188
2189clip(path: Path2D, fillRule?: CanvasFillRule): void
2190
2191设置当前路径为剪切路径。
2192
2193**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
2194
2195**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2196
2197**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2198
2199**参数:**
2200
2201| 参数名      | 类型             | 必填   | 说明          |
2202| -------- | -------------- | ---- | ---------------------------------------- |
2203| path     | [Path2D](ts-components-canvas-path2d.md)         | 是    | Path2D剪切路径。                              |
2204| fillRule | [CanvasFillRule](#canvasfillrule类型说明) | 否  | 指定要剪切对象的规则。<br/>可选参数为:"nonzero", "evenodd"。 <br>默认值:"nonzero"。 |
2205
2206
2207**示例:**
2208
2209  ```ts
2210  // xxx.ets
2211  @Entry
2212  @Component
2213  struct Clip {
2214    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2215    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2216    build() {
2217      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2218        Canvas(this.context)
2219          .width('100%')
2220          .height('100%')
2221          .backgroundColor('#ffff00')
2222          .onReady(() =>{
2223            let region = new Path2D()
2224            region.moveTo(30, 90)
2225            region.lineTo(110, 20)
2226            region.lineTo(240, 130)
2227            region.lineTo(60, 130)
2228            region.lineTo(190, 20)
2229            region.lineTo(270, 90)
2230            region.closePath()
2231            this.context.clip(region,"evenodd")
2232            this.context.fillStyle = "rgb(0,255,0)"
2233            this.context.fillRect(0, 0, this.context.width, this.context.height)
2234          })
2235      }
2236      .width('100%')
2237      .height('100%')
2238    }
2239  }
2240  ```
2241
2242  ![zh-cn_image_000000127777779](figures/zh-cn_image_000000127777779.jpg)
2243
2244
2245### reset<sup>12+</sup>
2246
2247reset(): void
2248
2249将CanvasRenderingContext2D重置为其默认状态,清除后台缓冲区、绘制状态栈、绘制路径和样式。
2250
2251**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2252
2253**示例:**
2254
2255  ```ts
2256  // xxx.ets
2257  @Entry
2258  @Component
2259  struct Reset {
2260    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2261    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2262
2263    build() {
2264      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2265        Canvas(this.context)
2266          .width('100%')
2267          .height('100%')
2268          .backgroundColor('#ffff00')
2269          .onReady(() =>{
2270            this.context.fillStyle = '#0000ff'
2271            this.context.fillRect(20, 20, 150, 100)
2272            this.context.reset()
2273            this.context.fillRect(20, 150, 150, 100)
2274          })
2275      }
2276      .width('100%')
2277      .height('100%')
2278    }
2279  }
2280  ```
2281
2282  ![zh-cn_image_0000001239032460](figures/zh-cn_image_0000001239032460.png)
2283
2284
2285### saveLayer<sup>12+</sup>
2286
2287saveLayer(): void
2288
2289创建一个图层。
2290
2291**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2292
2293**示例:**
2294
2295  ```ts
2296  // xxx.ets
2297  @Entry
2298  @Component
2299  struct saveLayer {
2300  private settings: RenderingContextSettings = new RenderingContextSettings(true)
2301  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2302
2303  build() {
2304    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2305      Canvas(this.context)
2306        .width('100%')
2307        .height('100%')
2308        .backgroundColor('#ffff00')
2309        .onReady(() =>{
2310          this.context.fillStyle = "#0000ff"
2311          this.context.fillRect(50,100,300,100)
2312          this.context.fillStyle = "#00ffff"
2313          this.context.fillRect(50,150,300,100)
2314          this.context.globalCompositeOperation = 'destination-over'
2315          this.context.saveLayer()
2316          this.context.globalCompositeOperation = 'source-over'
2317          this.context.fillStyle = "#ff0000"
2318          this.context.fillRect(100,50,100,300)
2319          this.context.fillStyle = "#00ff00"
2320          this.context.fillRect(150,50,100,300)
2321          this.context.restoreLayer()
2322        })
2323    }
2324    .width('100%')
2325    .height('100%')
2326  }
2327  }
2328
2329  ```
2330   ![zh-cn_image_CanvasSavelayer](figures/zh-cn_image_CanvasSavelayer.png)
2331
2332### restoreLayer<sup>12+</sup>
2333
2334restoreLayer(): void
2335
2336恢复图像变换和裁剪状态至saveLayer前的状态,并将图层绘制在canvas上。restoreLayer示例代码同saveLayer。
2337
2338**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2339
2340### resetTransform
2341
2342resetTransform(): void
2343
2344使用单位矩阵重新设置当前矩阵。
2345
2346**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
2347
2348**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2349
2350**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2351
2352**示例:**
2353
2354  ```ts
2355  // xxx.ets
2356  @Entry
2357  @Component
2358  struct ResetTransform {
2359    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2360    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2361
2362    build() {
2363      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2364        Canvas(this.context)
2365          .width('100%')
2366          .height('100%')
2367          .backgroundColor('#ffff00')
2368          .onReady(() =>{
2369            this.context.setTransform(1,0.5, -0.5, 1, 10, 10)
2370            this.context.fillStyle = 'rgb(0,0,255)'
2371            this.context.fillRect(0, 0, 100, 100)
2372            this.context.resetTransform()
2373            this.context.fillStyle = 'rgb(255,0,0)'
2374            this.context.fillRect(0, 0, 100, 100)
2375          })
2376      }
2377      .width('100%')
2378      .height('100%')
2379    }
2380  }
2381  ```
2382
2383  ![zh-cn_image_0000001239032417](figures/zh-cn_image_ResetTransform.png)
2384
2385### rotate
2386
2387rotate(angle: number): void
2388
2389针对当前坐标轴进行顺时针旋转。
2390
2391**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
2392
2393**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2394
2395**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2396
2397**参数:**
2398
2399| 参数名    | 类型     | 必填   | 说明                                       |
2400| ----- | ------ | ---- |  ---------------------------------------- |
2401| angle | number | 是   | 设置顺时针旋转的弧度值,可以通过 degree * Math.PI / 180 将角度转换为弧度值。<br>单位:弧度。 |
2402
2403**示例:**
2404
2405  ```ts
2406  // xxx.ets
2407  @Entry
2408  @Component
2409  struct Rotate {
2410    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2411    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2412
2413    build() {
2414      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2415        Canvas(this.context)
2416          .width('100%')
2417          .height('100%')
2418          .backgroundColor('#ffff00')
2419          .onReady(() =>{
2420            this.context.rotate(45 * Math.PI / 180)
2421            this.context.fillRect(70, 20, 50, 50)
2422          })
2423      }
2424      .width('100%')
2425      .height('100%')
2426    }
2427  }
2428  ```
2429
2430  ![zh-cn_image_0000001239032417](figures/zh-cn_image_0000001239032417.png)
2431
2432
2433### scale
2434
2435scale(x: number, y: number): void
2436
2437设置canvas画布的缩放变换属性,后续的绘制操作将按照缩放比例进行缩放。
2438
2439**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
2440
2441**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2442
2443**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2444
2445**参数:**
2446
2447| 参数名   | 类型     | 必填  | 说明    |
2448| ---- | ------ | ---- | ----------- |
2449| x    | number | 是  | 设置水平方向的缩放值。 |
2450| y    | number | 是  | 设置垂直方向的缩放值。 |
2451
2452**示例:**
2453
2454  ```ts
2455  // xxx.ets
2456  @Entry
2457  @Component
2458  struct Scale {
2459    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2460    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2461
2462    build() {
2463      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2464        Canvas(this.context)
2465          .width('100%')
2466          .height('100%')
2467          .backgroundColor('#ffff00')
2468          .onReady(() =>{
2469            this.context.lineWidth = 3
2470            this.context.strokeRect(30, 30, 50, 50)
2471            this.context.scale(2, 2) // Scale to 200%
2472            this.context.strokeRect(30, 30, 50, 50)
2473          })
2474      }
2475      .width('100%')
2476      .height('100%')
2477    }
2478  }
2479  ```
2480
2481  ![zh-cn_image_0000001193872498](figures/zh-cn_image_0000001193872498.png)
2482
2483
2484### transform
2485
2486transform(a: number, b: number, c: number, d: number, e: number, f: number): void
2487
2488transform方法对应一个变换矩阵,想对一个图形进行变化的时候,只要设置此变换矩阵相应的参数,对图形的各个定点的坐标分别乘以这个矩阵,就能得到新的定点的坐标。矩阵变换效果可叠加。
2489
2490**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
2491
2492**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2493
2494**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2495
2496> **说明:**
2497> 变换后的坐标计算方式(x和y为变换前坐标,x'和y'为变换后坐标):
2498>
2499> - x' = scaleX \* x + skewY \* y + translateX
2500>
2501> - y' = skewX \* x + scaleY \* y + translateY
2502
2503**参数:**
2504
2505| 参数名   | 类型     | 必填   | 说明                   |
2506| ---- | ------ | ---- | -------------------- |
2507| a    | number | 是  | scaleX: 指定水平缩放值。  |
2508| b    | number | 是  | skewY: 指定垂直倾斜值。   |
2509| c    | number | 是  | skewX: 指定水平倾斜值。   |
2510| d    | number | 是  | scaleY: 指定垂直缩放值。  |
2511| e    | number | 是  | translateX: 指定水平移动值。<br>默认单位:vp。 |
2512| f    | number | 是  | translateY: 指定垂直移动值。<br>默认单位:vp。 |
2513
2514**示例:**
2515
2516  ```ts
2517  // xxx.ets
2518  @Entry
2519  @Component
2520  struct Transform {
2521    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2522    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2523
2524    build() {
2525      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2526        Canvas(this.context)
2527          .width('100%')
2528          .height('100%')
2529          .backgroundColor('#ffff00')
2530          .onReady(() => {
2531            this.context.fillStyle = 'rgb(0,0,0)'
2532            this.context.fillRect(0, 0, 100, 100)
2533            this.context.transform(1, 0.5, -0.5, 1, 10, 10)
2534            this.context.fillStyle = 'rgb(255,0,0)'
2535            this.context.fillRect(0, 0, 100, 100)
2536            this.context.transform(1, 0.5, -0.5, 1, 10, 10)
2537            this.context.fillStyle = 'rgb(0,0,255)'
2538            this.context.fillRect(0, 0, 100, 100)
2539          })
2540      }
2541      .width('100%')
2542      .height('100%')
2543    }
2544  }
2545  ```
2546
2547  ![transform](figures/transform.jpg)
2548
2549
2550### setTransform
2551
2552setTransform(a: number, b: number, c: number, d: number, e: number, f: number): void
2553
2554setTransform方法使用的参数和transform()方法相同,但setTransform()方法会重置现有的变换矩阵并创建新的变换矩阵。
2555
2556**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
2557
2558**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2559
2560**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2561
2562**参数:**
2563
2564| 参数名   | 类型     | 必填   | 说明    |
2565| ---- | ------ | ---- | -------------------- |
2566| a    | number | 是 | scaleX: 指定水平缩放值。 |
2567| b    | number | 是 | skewY: 指定垂直倾斜值。  |
2568| c    | number | 是 | skewX: 指定水平倾斜值。  |
2569| d    | number | 是 | scaleY: 指定垂直缩放值。 |
2570| e    | number | 是 | translateX: 指定水平移动值。<br>默认单位:vp。 |
2571| f    | number | 是 | translateY: 指定垂直移动值。<br>默认单位:vp。 |
2572
2573**示例:**
2574
2575  ```ts
2576  // xxx.ets
2577  @Entry
2578  @Component
2579  struct SetTransform {
2580    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2581    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2582
2583    build() {
2584      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2585        Canvas(this.context)
2586          .width('100%')
2587          .height('100%')
2588          .backgroundColor('#ffff00')
2589          .onReady(() =>{
2590            this.context.fillStyle = 'rgb(255,0,0)'
2591            this.context.fillRect(0, 0, 100, 100)
2592            this.context.setTransform(1,0.5, -0.5, 1, 10, 10)
2593            this.context.fillStyle = 'rgb(0,0,255)'
2594            this.context.fillRect(0, 0, 100, 100)
2595          })
2596      }
2597      .width('100%')
2598      .height('100%')
2599    }
2600  }
2601  ```
2602
2603  ![zh-cn_image_0000001238712421](figures/zh-cn_image_0000001238712421.png)
2604
2605setTransform(transform?: Matrix2D): void
2606
2607以Matrix2D对象为模板重置现有的变换矩阵并创建新的变换矩阵。
2608
2609**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
2610
2611**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2612
2613**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2614
2615**参数:**
2616
2617| 参数名  | 类型 | 必填 | 说明  |
2618| --------- | ---------------------------------------- | ---- | ----- |
2619| transform | [Matrix2D](ts-components-canvas-matrix2d.md#Matrix2D) | 否 | 变换矩阵。<br>默认值:null。 |
2620
2621**示例:**
2622
2623  ```ts
2624  // xxx.ets
2625  @Entry
2626  @Component
2627  struct TransFormDemo {
2628    private settings: RenderingContextSettings = new RenderingContextSettings(true);
2629    private context1: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.  settings);
2630    private context2: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
2631
2632    build() {
2633      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2634        Text('context1');
2635        Canvas(this.context1)
2636          .width('230vp')
2637          .height('160vp')
2638          .backgroundColor('#ffff00')
2639          .onReady(() =>{
2640            this.context1.fillRect(100, 20, 50, 50);
2641            this.context1.setTransform(1, 0.5, -0.5, 1, 10, 10);
2642            this.context1.fillRect(100, 20, 50, 50);
2643          })
2644        Text('context2');
2645        Canvas(this.context2)
2646          .width('230vp')
2647          .height('160vp')
2648          .backgroundColor('#0ffff0')
2649          .onReady(() =>{
2650            this.context2.fillRect(100, 20, 50, 50);
2651            let storedTransform = this.context1.getTransform();
2652            this.context2.setTransform(storedTransform);
2653            this.context2.fillRect(100, 20, 50, 50);
2654          })
2655      }
2656      .width('100%')
2657      .height('100%')
2658    }
2659  }
2660  ```
2661
2662  ![zh-cn_image_0000001238712422.jpeg](figures/zh-cn_image_0000001238712422.jpeg)
2663
2664### getTransform
2665
2666getTransform(): Matrix2D
2667
2668获取当前被应用到上下文的转换矩阵。
2669
2670**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
2671
2672**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2673
2674**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2675
2676**返回值:**
2677
2678| 类型                                       | 说明    |
2679| ---------------------------------------- | ----- |
2680| [Matrix2D](ts-components-canvas-matrix2d.md#Matrix2D) | 矩阵对象。 |
2681
2682**示例:**
2683
2684  ```ts
2685  // xxx.ets
2686  @Entry
2687  @Component
2688  struct TransFormDemo {
2689    private settings: RenderingContextSettings = new RenderingContextSettings(true);
2690    private context1: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
2691    private context2: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
2692
2693    build() {
2694      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2695        Text('context1');
2696        Canvas(this.context1)
2697          .width('230vp')
2698          .height('120vp')
2699          .backgroundColor('#ffff00')
2700          .onReady(() =>{
2701            this.context1.fillRect(50, 50, 50, 50);
2702            this.context1.setTransform(1.2, Math.PI/8, Math.PI/6, 0.5, 30, -25);
2703            this.context1.fillRect(50, 50, 50, 50);
2704          })
2705        Text('context2');
2706        Canvas(this.context2)
2707          .width('230vp')
2708          .height('120vp')
2709          .backgroundColor('#0ffff0')
2710          .onReady(() =>{
2711            this.context2.fillRect(50, 50, 50, 50);
2712            let storedTransform = this.context1.getTransform();
2713            console.log("Matrix [scaleX = " + storedTransform.scaleX + ", scaleY = " + storedTransform.scaleY +
2714            ", rotateX = " + storedTransform.rotateX + ", rotateY = " + storedTransform.rotateY +
2715            ", translateX = " + storedTransform.translateX + ", translateY = " + storedTransform.translateY + "]")
2716            this.context2.setTransform(storedTransform);
2717            this.context2.fillRect(50,50,50,50);
2718          })
2719      }
2720      .width('100%')
2721      .height('100%')
2722    }
2723  }
2724  ```
2725
2726  ![zh-cn_image_0000001219982726.png](figures/zh-cn_image_0000001219982726.png)
2727
2728### translate
2729
2730translate(x: number, y: number): void
2731
2732移动当前坐标系的原点。
2733
2734**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
2735
2736**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2737
2738**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2739
2740**参数:**
2741
2742| 参数名   | 类型     | 必填   | 说明 |
2743| ---- | ------ | ---- | -------- |
2744| x    | number | 是   | 设置水平平移量。<br>默认单位:vp。 |
2745| y    | number | 是   | 设置竖直平移量。<br>默认单位:vp。 |
2746
2747**示例:**
2748
2749  ```ts
2750  // xxx.ets
2751  @Entry
2752  @Component
2753  struct Translate {
2754    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2755    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2756
2757    build() {
2758      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2759        Canvas(this.context)
2760          .width('100%')
2761          .height('100%')
2762          .backgroundColor('#ffff00')
2763          .onReady(() =>{
2764            this.context.fillRect(10, 10, 50, 50)
2765            this.context.translate(70, 70)
2766            this.context.fillRect(10, 10, 50, 50)
2767          })
2768      }
2769      .width('100%')
2770      .height('100%')
2771    }
2772  }
2773  ```
2774
2775  ![zh-cn_image_0000001194192446](figures/zh-cn_image_0000001194192446.png)
2776
2777
2778### drawImage
2779
2780drawImage(image: ImageBitmap | PixelMap, dx: number, dy: number): void
2781
2782进行图像绘制。
2783
2784**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用,卡片中不支持PixelMap对象。
2785
2786**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2787
2788**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2789
2790**参数:**
2791
2792| 参数名  | 类型  | 必填  | 说明 |
2793| ----- | ---------------------------------------- | ---- | ---------------------------------------- |
2794| image | [ImageBitmap](ts-components-canvas-imagebitmap.md)或[PixelMap](../../apis-image-kit/js-apis-image.md#pixelmap7) | 是    | 图片资源,请参考ImageBitmap或PixelMap。            |
2795| dx    | number                                   | 是  | 绘制区域左上角在x轴的位置。<br>默认单位:vp。|
2796| dy    | number                                   | 是  | 绘制区域左上角在y轴的位置。<br>默认单位:vp。|
2797
2798drawImage(image: ImageBitmap | PixelMap, dx: number, dy: number, dw: number, dh: number): void
2799
2800进行图像绘制。
2801
2802**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用,卡片中不支持PixelMap对象。
2803
2804**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2805
2806**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2807
2808**参数:**
2809
2810| 参数名  | 类型  | 必填  | 说明 |
2811| ----- | ---------------------------------------- | ---- | ---------------------------------------- |
2812| image | [ImageBitmap](ts-components-canvas-imagebitmap.md)或[PixelMap](../../apis-image-kit/js-apis-image.md#pixelmap7) | 是    | 图片资源,请参考ImageBitmap或PixelMap。            |
2813| dx    | number                                   | 是  | 绘制区域左上角在x轴的位置。<br>默认单位:vp。|
2814| dy    | number                                   | 是  | 绘制区域左上角在y轴的位置。<br>默认单位:vp。|
2815| dw    | number                                   | 是  | 绘制区域的宽度。当绘制区域的宽度和裁剪图像的宽度不一致时,将图像宽度拉伸或压缩为绘制区域的宽度。<br>默认单位:vp。 |
2816| dh    | number                                   | 是  | 绘制区域的高度。当绘制区域的高度和裁剪图像的高度不一致时,将图像高度拉伸或压缩为绘制区域的高度。<br>默认单位:vp。 |
2817
2818drawImage(image: ImageBitmap | PixelMap, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): void
2819
2820进行图像绘制。
2821
2822**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用,卡片中不支持PixelMap对象。
2823
2824**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2825
2826**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2827
2828**参数:**
2829
2830| 参数名  | 类型  | 必填  | 说明 |
2831| ----- | ---------------------------------------- | ---- | ---------------------------------------- |
2832| image | [ImageBitmap](ts-components-canvas-imagebitmap.md)或[PixelMap](../../apis-image-kit/js-apis-image.md#pixelmap7) | 是    | 图片资源,请参考ImageBitmap或PixelMap。            |
2833| sx    | number                                   | 是  | 裁切源图像时距离源图像左上角的x坐标值。<br>image类型为ImageBitmap时,默认单位:vp。<br>image类型为PixelMap时,API version 18前,默认单位:px;API version 18及以后,默认单位:vp。 |
2834| sy    | number                                   | 是  | 裁切源图像时距离源图像左上角的y坐标值。<br>image类型为ImageBitmap时,默认单位:vp。<br>image类型为PixelMap时,API version 18前,默认单位:px;API version 18及以后,默认单位:vp。  |
2835| sw    | number                                   | 是  | 裁切源图像时需要裁切的宽度。<br>image类型为ImageBitmap时,默认单位:vp。<br>image类型为PixelMap时,API version 18前,默认单位:px;API version 18及以后,默认单位:vp。  |
2836| sh    | number                                   | 是  | 裁切源图像时需要裁切的高度。<br>image类型为ImageBitmap时,默认单位:vp。<br>image类型为PixelMap时,API version 18前,默认单位:px;API version 18及以后,默认单位:vp。  |
2837| dx    | number                                   | 是  | 绘制区域左上角在x轴的位置。<br>默认单位:vp。|
2838| dy    | number                                   | 是  | 绘制区域左上角在y轴的位置。<br>默认单位:vp。|
2839| dw    | number                                   | 是  | 绘制区域的宽度。当绘制区域的宽度和裁剪图像的宽度不一致时,将图像宽度拉伸或压缩为绘制区域的宽度。<br>默认单位:vp。 |
2840| dh    | number                                   | 是  | 绘制区域的高度。当绘制区域的高度和裁剪图像的高度不一致时,将图像高度拉伸或压缩为绘制区域的高度。<br>默认单位:vp。 |
2841
2842**示例:**
2843
2844  ```ts
2845  // xxx.ets
2846  @Entry
2847  @Component
2848  struct ImageExample {
2849    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2850    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2851    private img: ImageBitmap = new ImageBitmap("common/images/example.jpg")
2852
2853    build() {
2854      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2855        Canvas(this.context)
2856          .width('100%')
2857          .height('100%')
2858          .backgroundColor('#ffff00')
2859          .onReady(() => {
2860            this.context.drawImage(this.img, 0, 0)
2861            this.context.drawImage(this.img, 0, 150, 300, 100)
2862            this.context.drawImage(this.img, 0, 0, 500, 500, 0, 300, 400, 200)
2863          })
2864      }
2865      .width('100%')
2866      .height('100%')
2867    }
2868  }
2869  ```
2870
2871  ![zh-cn_image_0000001194352442](figures/zh-cn_image_0000001194352441.png)
2872
2873
2874### createImageData
2875
2876createImageData(sw: number, sh: number): ImageData
2877
2878创建新的、空白的、指定大小的ImageData 对象,请参考[ImageData](ts-components-canvas-imagedata.md),该接口存在内存拷贝行为,高耗时,应避免频繁使用。createImageData示例同putImageData。
2879
2880**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
2881
2882**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2883
2884**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2885
2886**参数:**
2887
2888| 参数名   | 类型     | 必填   | 说明 |
2889| ---- | ------ | ---- | ------------- |
2890| sw   | number | 是 | ImageData的宽度。<br>默认单位:vp。 |
2891| sh   | number | 是 | ImageData的高度。<br>默认单位:vp。 |
2892
2893
2894createImageData(imageData: ImageData): ImageData
2895
2896根据一个现有的ImageData对象重新创建一个宽、高相同的ImageData对象(不会复制图像数据),请参考[ImageData](ts-components-canvas-imagedata.md),该接口存在内存拷贝行为,高耗时,应避免频繁使用。createImageData示例同putImageData。
2897
2898**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
2899
2900**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2901
2902**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2903
2904**参数:**
2905
2906| 参数名 | 类型  | 必填 | 说明  |
2907| --------- | ---------------------------------------- | ---- | ----------------- |
2908| imagedata | [ImageData](ts-components-canvas-imagedata.md) | 是 | 现有的ImageData对象。 |
2909
2910  **返回值:**
2911
2912| 类型                                       | 说明             |
2913| ---------------------------------------- | -------------- |
2914| [ImageData](ts-components-canvas-imagedata.md) | 新的ImageData对象。 |
2915
2916
2917### getPixelMap
2918
2919getPixelMap(sx: number, sy: number, sw: number, sh: number): PixelMap
2920
2921以当前canvas指定区域内的像素创建[PixelMap](../../apis-image-kit/js-apis-image.md#pixelmap7)对象,该接口存在内存拷贝行为,高耗时,应避免频繁使用。
2922
2923**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2924
2925**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2926
2927**参数:**
2928
2929| 参数名   | 类型     | 必填 | 说明 |
2930| ---- | ------ | ---- | --------------- |
2931| sx   | number | 是  | 需要输出的区域的左上角x坐标。<br>默认单位:vp。 |
2932| sy   | number | 是  | 需要输出的区域的左上角y坐标。<br>默认单位:vp。 |
2933| sw   | number | 是  | 需要输出的区域的宽度。<br>默认单位:vp。 |
2934| sh   | number | 是  | 需要输出的区域的高度。<br>默认单位:vp。 |
2935
2936**返回值:**
2937
2938| 类型                                       | 说明            |
2939| ---------------------------------------- | ------------- |
2940| [PixelMap](../../apis-image-kit/js-apis-image.md#pixelmap7) | 新的PixelMap对象。 |
2941
2942**示例:**
2943
2944> **说明:**
2945>
2946> DevEco Studio的预览器不支持显示使用setPixelMap绘制的内容。
2947
2948  ```ts
2949  // xxx.ets
2950  @Entry
2951  @Component
2952  struct GetPixelMap {
2953    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2954    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2955    private img: ImageBitmap = new ImageBitmap("common/images/example.jpg")
2956
2957    build() {
2958      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2959        Canvas(this.context)
2960          .width('100%')
2961          .height('100%')
2962          .backgroundColor('#ffff00')
2963          .onReady(() => {
2964            this.context.drawImage(this.img, 100, 100, 130, 130)
2965            let pixelmap = this.context.getPixelMap(150, 150, 130, 130)
2966            this.context.setPixelMap(pixelmap)
2967          })
2968      }
2969      .width('100%')
2970      .height('100%')
2971    }
2972  }
2973  ```
2974
2975  ![zh-cn_image_000000127777782](figures/zh-cn_image_000000127777782.png)
2976
2977### setPixelMap
2978
2979setPixelMap(value?: PixelMap): void
2980
2981将当前传入[PixelMap](../../apis-image-kit/js-apis-image.md#pixelmap7)对象绘制在画布上。setPixelMap示例同getPixelMap。
2982
2983**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
2984
2985**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2986
2987 **参数:**
2988
2989| 参数名   | 类型     | 必填   | 说明 |
2990| ---- | ------ | ---- | --------------- |
2991|  value  | [PixelMap](../../apis-image-kit/js-apis-image.md#pixelmap7) | 否 | 包含像素值的PixelMap对象<br>默认值:null。 |
2992
2993### getImageData
2994
2995getImageData(sx: number, sy: number, sw: number, sh: number): ImageData
2996
2997以当前canvas指定区域内的像素创建[ImageData](ts-components-canvas-imagedata.md)对象,该接口存在内存拷贝行为,高耗时,应避免频繁使用。
2998
2999**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3000
3001**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3002
3003**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3004
3005**参数:**
3006
3007| 参数名 | 类型 | 必填   | 说明  |
3008| ---- | ------ | ---- | --------------- |
3009| sx   | number | 是 | 需要输出的区域的左上角x坐标。<br>默认单位:vp。 |
3010| sy   | number | 是 | 需要输出的区域的左上角y坐标。<br>默认单位:vp。 |
3011| sw   | number | 是 | 需要输出的区域的宽度。<br>默认单位:vp。 |
3012| sh   | number | 是 | 需要输出的区域的高度。<br>默认单位:vp。 |
3013
3014  **返回值:**
3015
3016| 类型                                       | 说明             |
3017| ---------------------------------------- | -------------- |
3018| [ImageData](ts-components-canvas-imagedata.md) | 新的ImageData对象。 |
3019
3020
3021**示例:**
3022
3023  ```ts
3024  // xxx.ets
3025  @Entry
3026  @Component
3027  struct GetImageData {
3028    private settings: RenderingContextSettings = new RenderingContextSettings(true)
3029    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3030    private img:ImageBitmap = new ImageBitmap("/common/images/1234.png")
3031
3032    build() {
3033      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3034        Canvas(this.context)
3035          .width('100%')
3036          .height('100%')
3037          .backgroundColor('#ffff00')
3038          .onReady(() =>{
3039            this.context.drawImage(this.img,0,0,130,130)
3040            let imagedata = this.context.getImageData(50,50,130,130)
3041            this.context.putImageData(imagedata,150,150)
3042          })
3043      }
3044      .width('100%')
3045      .height('100%')
3046    }
3047  }
3048  ```
3049
3050  ![zh-cn_image_000000127777780](figures/zh-cn_image_000000127777780.png)
3051
3052
3053### putImageData
3054
3055putImageData(imageData: ImageData, dx: number | string, dy: number | string): void
3056
3057使用[ImageData](ts-components-canvas-imagedata.md)数据填充新的矩形区域。
3058
3059**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3060
3061**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3062
3063**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3064
3065**参数:**
3066
3067| 参数名 | 类型 | 必填  | 说明 |
3068| ----------- | ---------------------------------------- | ---- | ----------------------------- |
3069| imagedata   | [ImageData](ts-components-canvas-imagedata.md) | 是    | 包含像素值的ImageData对象。 |
3070| dx          | number&nbsp;\|&nbsp;string<sup>10+</sup> | 是    | 填充区域在x轴方向的偏移量。<br>默认单位:vp。 |
3071| dy          | number&nbsp;\|&nbsp;string<sup>10+</sup> | 是    | 填充区域在y轴方向的偏移量。<br>默认单位:vp。 |
3072
3073putImageData(imageData: ImageData, dx: number | string, dy: number | string, dirtyX: number | string, dirtyY: number | string, dirtyWidth: number | string, dirtyHeight: number | string): void
3074
3075使用[ImageData](ts-components-canvas-imagedata.md)数据填充新的矩形区域。
3076
3077**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3078
3079**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3080
3081**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3082
3083**参数:**
3084
3085| 参数名 | 类型 | 必填  | 说明 |
3086| ----------- | ---------------------------------------- | ---- | ----------------------------- |
3087| imagedata   | [ImageData](ts-components-canvas-imagedata.md) | 是    | 包含像素值的ImageData对象。 |
3088| dx          | number&nbsp;\|&nbsp;string<sup>10+</sup> | 是    | 填充区域在x轴方向的偏移量。<br>默认单位:vp。 |
3089| dy          | number&nbsp;\|&nbsp;string<sup>10+</sup> | 是    | 填充区域在y轴方向的偏移量。<br>默认单位:vp。 |
3090| dirtyX      | number&nbsp;\|&nbsp;string<sup>10+</sup> | 是    | 源图像数据矩形裁切范围左上角距离源图像左上角的x轴偏移量。<br>默认单位:vp。 |
3091| dirtyY      | number&nbsp;\|&nbsp;string<sup>10+</sup> | 是    | 源图像数据矩形裁切范围左上角距离源图像左上角的y轴偏移量。<br>默认单位:vp。 |
3092| dirtyWidth  | number&nbsp;\|&nbsp;string<sup>10+</sup> | 是    | 源图像数据矩形裁切范围的宽度。<br>默认单位:vp。 |
3093| dirtyHeight | number&nbsp;\|&nbsp;string<sup>10+</sup> | 是    | 源图像数据矩形裁切范围的高度。<br>默认单位:vp。 |
3094
3095**示例:**
3096
3097  ```ts
3098  // xxx.ets
3099  @Entry
3100  @Component
3101  struct PutImageData {
3102    private settings: RenderingContextSettings = new RenderingContextSettings(true)
3103    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3104
3105    build() {
3106      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3107        Canvas(this.context)
3108          .width('100%')
3109          .height('100%')
3110          .backgroundColor('#ffff00')
3111          .onReady(() => {
3112            let imageDataNum = this.context.createImageData(100, 100)
3113            let imageData = this.context.createImageData(imageDataNum)
3114            for (let i = 0; i < imageData.data.length; i += 4) {
3115              imageData.data[i + 0] = 255
3116              imageData.data[i + 1] = 0
3117              imageData.data[i + 2] = 255
3118              imageData.data[i + 3] = 255
3119            }
3120            this.context.putImageData(imageData, 10, 10)
3121            this.context.putImageData(imageData, 150, 10, 0, 0, 50, 50)
3122          })
3123      }
3124      .width('100%')
3125      .height('100%')
3126    }
3127  }
3128  ```
3129
3130  ![zh-cn_image_0000001238952387](figures/zh-cn_image_0000001238952387.png)
3131
3132
3133### setLineDash
3134
3135setLineDash(segments: number[]): void
3136
3137设置画布的虚线样式。
3138
3139**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3140
3141**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3142
3143**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3144
3145**参数:**
3146
3147| 参数名      | 类型      | 必填  | 说明 |
3148| -------- | -------- | ------- | ------------ |
3149| segments | number[] | 是 | 描述线段如何交替和线段间距长度的数组。<br>默认单位:vp。 |
3150
3151**示例:**
3152
3153  ```ts
3154  // xxx.ets
3155  @Entry
3156  @Component
3157  struct SetLineDash {
3158    private settings: RenderingContextSettings = new RenderingContextSettings(true)
3159    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3160
3161    build() {
3162      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3163        Canvas(this.context)
3164          .width('100%')
3165          .height('100%')
3166          .backgroundColor('#ffff00')
3167          .onReady(() =>{
3168            this.context.arc(100, 75, 50, 0, 6.28)
3169            this.context.setLineDash([10,20])
3170            this.context.stroke()
3171          })
3172      }
3173      .width('100%')
3174      .height('100%')
3175    }
3176  }
3177  ```
3178
3179  ![zh-cn_image_000000127777771](figures/zh-cn_image_000000127777771.png)
3180
3181
3182### getLineDash
3183
3184getLineDash(): number[]
3185
3186获得当前画布的虚线样式。
3187
3188**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3189
3190**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3191
3192**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3193
3194**返回值:**
3195
3196| 类型       | 说明                       |
3197| -------- | ------------------------ |
3198| number[] | 返回数组,该数组用来描述线段如何交替和间距长度。<br>默认单位:vp。 |
3199
3200
3201**示例:**
3202
3203  ```ts
3204  // xxx.ets
3205  @Entry
3206  @Component
3207  struct CanvasGetLineDash {
3208    @State message: string = 'Hello World'
3209    private settings: RenderingContextSettings = new RenderingContextSettings(true)
3210    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3211
3212    build() {
3213      Row() {
3214        Column() {
3215          Text(this.message)
3216            .fontSize(50)
3217            .fontWeight(FontWeight.Bold)
3218            .onClick(()=>{
3219              console.error('before getlinedash clicked')
3220              let res = this.context.getLineDash()
3221              console.error(JSON.stringify(res))
3222            })
3223          Canvas(this.context)
3224            .width('100%')
3225            .height('100%')
3226            .backgroundColor('#ffff00')
3227            .onReady(() => {
3228              this.context.arc(100, 75, 50, 0, 6.28)
3229              this.context.setLineDash([10,20])
3230              this.context.stroke()
3231            })
3232        }
3233        .width('100%')
3234      }
3235      .height('100%')
3236    }
3237  }
3238  ```
3239![zh-cn_image_000000127777778](figures/zh-cn_image_000000127777778.png)
3240
3241
3242### transferFromImageBitmap
3243
3244transferFromImageBitmap(bitmap: ImageBitmap): void
3245
3246显示给定的ImageBitmap对象。
3247
3248**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3249
3250**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3251
3252**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3253
3254**参数:**
3255
3256| 参数名 | 类型  | 必填 | 说明  |
3257| ------ | ----------------------- | ----------------- | ------------------ |
3258| bitmap | [ImageBitmap](ts-components-canvas-imagebitmap.md)  | 是 | 待显示的ImageBitmap对象。 |
3259
3260**示例:**
3261
3262  ```ts
3263  // xxx.ets
3264  @Entry
3265  @Component
3266  struct TransferFromImageBitmap {
3267    private settings: RenderingContextSettings = new RenderingContextSettings(true)
3268    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3269    private offContext: OffscreenCanvasRenderingContext2D = new OffscreenCanvasRenderingContext2D(600, 600, this.settings)
3270
3271    build() {
3272      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3273        Canvas(this.context)
3274          .width('100%')
3275          .height('100%')
3276          .backgroundColor('rgb(213,213,213)')
3277          .onReady(() =>{
3278            let imageData = this.offContext.createImageData(100, 100)
3279            for (let i = 0; i < imageData.data.length; i += 4) {
3280              imageData.data[i + 0] = 255
3281              imageData.data[i + 1] = 0
3282              imageData.data[i + 2] = 60
3283              imageData.data[i + 3] = 80
3284            }
3285            this.offContext.putImageData(imageData, 10, 10)
3286            let image = this.offContext.transferToImageBitmap()
3287            this.context.transferFromImageBitmap(image)
3288          })
3289      }
3290      .width('100%')
3291      .height('100%')
3292    }
3293  }
3294  ```
3295  ![transferFromImageBitmap](figures/transferFromImageBitmap.jpg)
3296
3297
3298### toDataURL
3299
3300toDataURL(type?: string, quality?: any): string
3301
3302生成一个包含图片展示的URL,该接口存在内存拷贝行为,高耗时,应避免频繁使用。
3303
3304**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3305
3306**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3307
3308**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3309
3310**参数:**
3311
3312| 参数名     | 类型   | 必填  | 说明  |
3313| ------- | ------ | ---- | ---------------------------------------- |
3314| type    | string | 否  | 用于指定图像格式。<br/>可选参数为:"image/png", "image/jpeg", "image/webp"。<br>默认值:image/png。            |
3315| quality | any | 否  | 在指定图片格式为image/jpegimage/webp的情况下,可以从0到1的区间内选择图片的质量。如果超出取值范围,将会使用默认值0.92。<br>默认值:0.92。 |
3316
3317**返回值:**
3318
3319| 类型     | 说明        |
3320| ------ | --------- |
3321| string | 图像的URL地址。 |
3322
3323**示例:**
3324
3325  ```ts
3326  // xxx.ets
3327  @Entry
3328  @Component
3329  struct CanvasExample {
3330    private settings: RenderingContextSettings = new RenderingContextSettings(true)
3331    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3332    @State toDataURL: string = ""
3333
3334    build() {
3335      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3336        Canvas(this.context)
3337          .width(100)
3338          .height(100)
3339          .onReady(() =>{
3340            this.context.fillStyle = "#00ff00"
3341            this.context.fillRect(0,0,100,100)
3342            this.toDataURL = this.context.toDataURL("image/png", 0.92)
3343          })
3344        Text(this.toDataURL)
3345      }
3346      .width('100%')
3347      .height('100%')
3348      .backgroundColor('#ffff00')
3349    }
3350  }
3351  ```
3352  ![zh-cn_image_0000001238952387](figures/zh-cn_image_0000001194192441.png)
3353
3354
3355### restore
3356
3357restore(): void
3358
3359对保存的绘图上下文进行恢复。
3360
3361> **说明:**
3362>
3363> 当restore()次数未超出save()次数时,从栈中弹出存储的绘制状态并恢复CanvasRenderingContext2D对象的属性、剪切路径和变换矩阵的值。</br>
3364> 当restore()次数超出save()次数时,此方法不做任何改变。</br>
3365> 当没有保存状态时,此方法不做任何改变。
3366
3367**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3368
3369**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3370
3371**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3372
3373**示例:**
3374
3375  ```ts
3376  // xxx.ets
3377  @Entry
3378  @Component
3379  struct CanvasExample {
3380    private settings: RenderingContextSettings = new RenderingContextSettings(true)
3381    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3382
3383    build() {
3384      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3385        Canvas(this.context)
3386          .width('100%')
3387          .height('100%')
3388          .backgroundColor('#ffff00')
3389          .onReady(() =>{
3390            this.context.save() // save the default state
3391            this.context.fillStyle = "#00ff00"
3392            this.context.fillRect(20, 20, 100, 100)
3393            this.context.restore() // restore to the default state
3394            this.context.fillRect(150, 75, 100, 100)
3395          })
3396      }
3397      .width('100%')
3398      .height('100%')
3399    }
3400  }
3401  ```
3402  ![zh-cn_image_000000127777781](figures/zh-cn_image_000000127777781.png)
3403
3404
3405### save
3406
3407save(): void
3408
3409将当前状态放入栈中,保存canvas的全部状态,通常在需要保存绘制状态时调用。
3410
3411**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3412
3413**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3414
3415**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3416
3417**示例:**
3418
3419  ```ts
3420  // xxx.ets
3421  @Entry
3422  @Component
3423  struct CanvasExample {
3424    private settings: RenderingContextSettings = new RenderingContextSettings(true)
3425    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3426
3427    build() {
3428      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3429        Canvas(this.context)
3430          .width('100%')
3431          .height('100%')
3432          .backgroundColor('#ffff00')
3433          .onReady(() =>{
3434            this.context.save() // save the default state
3435            this.context.fillStyle = "#00ff00"
3436            this.context.fillRect(20, 20, 100, 100)
3437            this.context.restore() // restore to the default state
3438            this.context.fillRect(150, 75, 100, 100)
3439          })
3440      }
3441      .width('100%')
3442      .height('100%')
3443    }
3444  }
3445  ```
3446  ![zh-cn_image_000000127777781](figures/zh-cn_image_000000127777781.png)
3447
3448
3449### createLinearGradient
3450
3451createLinearGradient(x0: number, y0: number, x1: number, y1: number): CanvasGradient
3452
3453创建一个线性渐变色。
3454
3455**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3456
3457**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3458
3459**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3460
3461**参数:**
3462
3463| 参数名   | 类型     | 必填 | 说明   |
3464| ---- | ------ | ---- | -------- |
3465| x0   | number | 是  | 起点的x轴坐标。<br>默认单位:vp。 |
3466| y0   | number | 是  | 起点的y轴坐标。<br>默认单位:vp。 |
3467| x1   | number | 是  | 终点的x轴坐标。<br>默认单位:vp。 |
3468| y1   | number | 是  | 终点的y轴坐标。<br>默认单位:vp。 |
3469
3470**返回值:**
3471
3472| 类型     | 说明        |
3473| ------ | --------- |
3474| [CanvasGradient](ts-components-canvas-canvasgradient.md) | 新的CanvasGradient对象,用于在canvas上创建渐变效果。 |
3475
3476**示例:**
3477
3478  ```ts
3479  // xxx.ets
3480  @Entry
3481  @Component
3482  struct CreateLinearGradient {
3483    private settings: RenderingContextSettings = new RenderingContextSettings(true)
3484    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3485
3486    build() {
3487      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3488        Canvas(this.context)
3489          .width('100%')
3490          .height('100%')
3491          .backgroundColor('#ffff00')
3492          .onReady(() =>{
3493            let grad = this.context.createLinearGradient(50,0, 300,100)
3494            grad.addColorStop(0.0, '#ff0000')
3495            grad.addColorStop(0.5, '#ffffff')
3496            grad.addColorStop(1.0, '#00ff00')
3497            this.context.fillStyle = grad
3498            this.context.fillRect(0, 0, 400, 400)
3499          })
3500      }
3501      .width('100%')
3502      .height('100%')
3503    }
3504  }
3505  ```
3506
3507  ![zh-cn_image_0000001194032516](figures/zh-cn_image_0000001194032516.jpeg)
3508
3509
3510### createRadialGradient
3511
3512createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): CanvasGradient
3513
3514创建一个径向渐变色。
3515
3516**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3517
3518**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3519
3520**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3521
3522**参数:**
3523
3524| 参数名   | 类型     | 必填   | 说明    |
3525| ---- | ------ | ---- | ----------------- |
3526| x0   | number | 是  | 起始圆的x轴坐标。<br>默认单位:vp。 |
3527| y0   | number | 是  | 起始圆的y轴坐标。<br>默认单位:vp。 |
3528| r0   | number | 是  | 起始圆的半径。必须是非负且有限的。<br>默认单位:vp。 |
3529| x1   | number | 是  | 终点圆的x轴坐标。<br>默认单位:vp。 |
3530| y1   | number | 是  | 终点圆的y轴坐标。<br>默认单位:vp。 |
3531| r1   | number | 是  | 终点圆的半径。必须为非负且有限的。<br>默认单位:vp。 |
3532
3533**返回值:**
3534
3535| 类型     | 说明        |
3536| ------ | --------- |
3537| [CanvasGradient](ts-components-canvas-canvasgradient.md) | 新的CanvasGradient对象,用于在canvas上创建渐变效果。 |
3538
3539**示例:**
3540
3541  ```ts
3542  // xxx.ets
3543  @Entry
3544  @Component
3545  struct CreateRadialGradient {
3546    private settings: RenderingContextSettings = new RenderingContextSettings(true)
3547    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3548
3549    build() {
3550      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3551        Canvas(this.context)
3552          .width('100%')
3553          .height('100%')
3554          .backgroundColor('#ffff00')
3555          .onReady(() =>{
3556            let grad = this.context.createRadialGradient(200,200,50, 200,200,200)
3557            grad.addColorStop(0.0, '#ff0000')
3558            grad.addColorStop(0.5, '#ffffff')
3559            grad.addColorStop(1.0, '#00ff00')
3560            this.context.fillStyle = grad
3561            this.context.fillRect(0, 0, 440, 440)
3562          })
3563      }
3564      .width('100%')
3565      .height('100%')
3566    }
3567  }
3568  ```
3569
3570  ![zh-cn_image_0000001238952407](figures/zh-cn_image_0000001238952407.jpeg)
3571
3572### createConicGradient<sup>10+</sup>
3573
3574createConicGradient(startAngle: number, x: number, y: number): CanvasGradient
3575
3576创建一个圆锥渐变色。
3577
3578**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3579
3580**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3581
3582**参数:**
3583
3584| 参数名   | 类型     | 必填 | 说明  |
3585| ---------- | ------ | ---- | ----------------------------------- |
3586| startAngle | number | 是    | 开始渐变的角度。角度测量从中心右侧水平开始,顺时针移动。<br>单位:弧度。 |
3587| x          | number | 是    | 圆锥渐变的中心x轴坐标。<br>默认单位:vp。 |
3588| y          | number | 是    | 圆锥渐变的中心y轴坐标。<br>默认单位:vp。 |
3589
3590**返回值:**
3591
3592| 类型     | 说明        |
3593| ------ | --------- |
3594| [CanvasGradient](ts-components-canvas-canvasgradient.md) | 新的CanvasGradient对象,用于在canvas上创建渐变效果。 |
3595
3596**示例:**
3597
3598```ts
3599// xxx.ets
3600@Entry
3601@Component
3602struct CanvasExample {
3603  private settings: RenderingContextSettings = new RenderingContextSettings(true)
3604  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3605
3606  build() {
3607    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3608      Canvas(this.context)
3609        .width('100%')
3610        .height('100%')
3611        .backgroundColor('#ffffff')
3612        .onReady(() => {
3613          let grad = this.context.createConicGradient(0, 50, 80)
3614          grad.addColorStop(0.0, '#ff0000')
3615          grad.addColorStop(0.5, '#ffffff')
3616          grad.addColorStop(1.0, '#00ff00')
3617          this.context.fillStyle = grad
3618          this.context.fillRect(0, 30, 100, 100)
3619        })
3620    }
3621    .width('100%')
3622    .height('100%')
3623  }
3624}
3625```
3626
3627  ![zh-cn_image_0000001239032419](figures/zh-cn_image_0000001239032420.png)
3628
3629### on('onAttach')<sup>13+</sup>
3630
3631on(type: 'onAttach', callback: () => void): void
3632
3633订阅CanvasRenderingContext2D与Canvas组件发生绑定的场景。
3634
3635**原子化服务API:** 从API version 13开始,该接口支持在原子化服务中使用。
3636
3637**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3638
3639**参数:**
3640
3641| 参数名 | 类型      | 必填 | 说明                                                                   |
3642| ------ | --------- | ---- | ---------------------------------------------------------------------- |
3643| type   | string | 是   | 订阅CanvasRenderingContext2D与Canvas组件发生绑定的回调 |
3644| callback   | () => void | 是   | 订阅CanvasRenderingContext2D与Canvas组件发生绑定后触发的回调 |
3645
3646> **说明:**
3647>
3648> CanvasRenderingContext2D对象在同一时间只能与一个Canvas组件绑定。</br>
3649> 当CanvasRenderingContext2D对象和Canvas组件发生绑定时,会触发'onAttach'回调,表示可以获取到[canvas](#canvas13)。</br>
3650> 避免在'onAttach'中执行绘制方法,应保证Canvas组件已经'[onReady](ts-components-canvas-canvas.md#事件)'再进行绘制。</br>
3651> 触发'onAttach'回调的一般场景:</br>
3652> 1、Canvas组件创建时绑定CanvasRenderingContext2D对象;</br>
3653> 2、CanvasRenderingContext2D对象新绑定一个Canvas组件时。</br>
3654
3655
3656### on('onDetach')<sup>13+</sup>
3657
3658on(type: 'onDetach', callback: () => void): void
3659
3660订阅CanvasRenderingContext2D与Canvas组件解除绑定的场景。
3661
3662**原子化服务API:** 从API version 13开始,该接口支持在原子化服务中使用。
3663
3664**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3665
3666**参数:**
3667
3668| 参数名 | 类型      | 必填 | 说明                                                                   |
3669| ------ | --------- | ---- | ---------------------------------------------------------------------- |
3670| type   | string | 是   | 订阅CanvasRenderingContext2D与Canvas组件解除绑定的回调 |
3671| callback   | () => void | 是   | 订阅CanvasRenderingContext2D与Canvas组件解除绑定后触发的回调 |
3672
3673> **说明:**
3674>
3675> 当CanvasRenderingContext2D对象和Canvas组件解除绑定时,会触发'onDetach'回调,表示应停止绘制行为。</br>
3676> 触发'onDetach'回调的一般场景:</br>
3677> 1、Canvas组件销毁时解除绑定CanvasRenderingContext2D对象;</br>
3678> 2、CanvasRenderingContext2D对象新绑定一个Canvas组件,会先解除已有的绑定。</br>
3679
3680### off('onAttach')<sup>13+</sup>
3681
3682off(type: 'onAttach', callback?: () => void): void
3683
3684取消订阅CanvasRenderingContext2D与Canvas组件发生绑定的场景。
3685
3686**原子化服务API:** 从API version 13开始,该接口支持在原子化服务中使用。
3687
3688**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3689
3690**参数:**
3691
3692| 参数名 | 类型      | 必填 | 说明                                                                   |
3693| ------ | --------- | ---- | ---------------------------------------------------------------------- |
3694| type   | string | 是   | 取消订阅CanvasRenderingContext2D与Canvas组件发生绑定的回调。 |
3695| callback   | () => void | 否   | 为空代表取消所有订阅CanvasRenderingContext2D与Canvas组件发生绑定后触发的回调。<br>非空代表取消订阅发生绑定对应的回调。 |
3696
3697### off('onDetach')<sup>13+</sup>
3698
3699off(type: 'onDetach', callback?: () => void): void
3700
3701取消订阅CanvasRenderingContext2D与Canvas组件解除绑定的场景。
3702
3703**原子化服务API:** 从API version 13开始,该接口支持在原子化服务中使用。
3704
3705**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3706
3707**参数:**
3708
3709| 参数名 | 类型      | 必填 | 说明                                                                   |
3710| ------ | --------- | ---- | ---------------------------------------------------------------------- |
3711| type   | string | 是   | 取消订阅CanvasRenderingContext2D与Canvas组件解除绑定的回调。 |
3712| callback   | () => void | 否   | 为空代表取消所有订阅CanvasRenderingContext2D与Canvas组件解除绑定后触发的回调。<br>非空代表取消订阅接触绑定对应的回调。 |
3713
3714**示例:**
3715
3716```ts
3717import { FrameNode } from '@kit.ArkUI'
3718// xxx.ets
3719@Entry
3720@Component
3721struct AttachDetachExample {
3722  private settings: RenderingContextSettings = new RenderingContextSettings(true)
3723  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3724  private scroller: Scroller = new Scroller()
3725  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
3726  private node: FrameNode | null = null
3727  private attachCallback: Callback<void> = this.attachFunc.bind(this)
3728  private detachCallback: Callback<void> = this.detachFunc.bind(this)
3729
3730  attachFunc(): void {
3731    console.info('CanvasRenderingContext2D attached to the canvas frame node.')
3732    this.node = this.context.canvas
3733  }
3734  detachFunc(): void {
3735    console.info('CanvasRenderingContext2D detach from the canvas frame node.')
3736    this.node = null
3737  }
3738  aboutToAppear(): void {
3739    this.context.on('onAttach', this.attachCallback)
3740    this.context.on('onDetach', this.detachCallback)
3741  }
3742  aboutToDisappear(): void {
3743    this.context.off('onAttach')
3744    this.context.off('onDetach')
3745  }
3746
3747  build() {
3748    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3749      Scroll(this.scroller) {
3750        Flex({ direction: FlexDirection.Column}) {
3751          ForEach(this.arr, (item: number) => {
3752            Row() {
3753              if (item == 3) {
3754                Canvas(this.context)
3755                  .width('100%')
3756                  .height(150)
3757                  .backgroundColor('rgb(213,213,213)')
3758                  .onReady(() => {
3759                    this.context.font = '30vp sans-serif'
3760                    this.node?.commonEvent.setOnVisibleAreaApproximateChange(
3761                      { ratios: [0, 1], expectedUpdateInterval: 10},
3762                      (isVisible: boolean, currentRatio: number) => {
3763                        if (!isVisible && currentRatio <= 0.0) {
3764                          console.info('Canvas is completely invisible.')
3765                        }
3766                        if (isVisible && currentRatio >= 1.0) {
3767                          console.info('Canvas is fully visible.')
3768                        }
3769                      }
3770                    )
3771                  })
3772              } else {
3773                Text(item.toString())
3774                  .width('100%')
3775                  .height(150)
3776                  .backgroundColor('rgb(39,135,217)')
3777                  .borderRadius(15)
3778                  .fontSize(16)
3779                  .textAlign(TextAlign.Center)
3780                  .margin({ top: 5 })
3781              }
3782            }
3783          }, (item: number) => item.toString())
3784        }
3785      }
3786      .width('90%')
3787      .scrollBar(BarState.Off)
3788      .scrollable(ScrollDirection.Vertical)
3789    }
3790    .width('100%')
3791    .height('100%')
3792  }
3793}
3794```
3795
3796![on_off_1](figures/on_off_cut.gif)
3797
3798### startImageAnalyzer<sup>12+</sup>
3799
3800startImageAnalyzer(config: ImageAnalyzerConfig): Promise\<void>
3801
3802配置AI分析并启动AI分析功能,使用前需先[启用图像AI分析能力](ts-components-canvas-canvas.md#enableanalyzer12)。<br>该方法调用时,将截取调用时刻的画面帧进行分析,使用时需注意启动分析的时机,避免出现画面和分析内容不一致的情况。<br>未执行完重复调用该方法会触发错误回调。示例代码同stopImageAnalyzer。
3803
3804> **说明:**
3805>
3806> 分析类型不支持动态修改。
3807> 当检测到画面有变化时,分析结果将自动销毁,可重新调用本接口启动分析。
3808> 该特性依赖设备能力,不支持该能力的情况下,将返回错误码。
3809
3810**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3811
3812**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3813
3814**参数:**
3815
3816| 参数名 | 类型      | 必填 | 说明                                                                   |
3817| ------ | --------- | ---- | ---------------------------------------------------------------------- |
3818| config   | [ImageAnalyzerConfig](ts-image-common.md#imageanalyzerconfig) | 是   | 执行AI分析所需要的入参,用于配置AI分析功能。 |
3819
3820**返回值:**
3821
3822| 类型              | 说明                                 |
3823| ----------------- | ------------------------------------ |
3824| Promise\<void>  | Promise对象,用于获取AI分析是否成功执行。 |
3825
3826**错误码:**
3827
3828以下错误码的详细介绍请参见[AI分析类库错误码](../errorcode-image-analyzer.md)。
3829
3830| 错误码ID | 错误信息                                      |
3831| -------- | -------------------------------------------- |
3832| 110001 | AI analysis is unsupported.               |
3833| 110002 | AI analysis is ongoing.  |
3834
3835### stopImageAnalyzer<sup>12+</sup>
3836
3837stopImageAnalyzer(): void
3838
3839停止AI分析功能,AI分析展示的内容将被销毁。
3840
3841> **说明:**
3842>
3843> 在startImageAnalyzer方法未返回结果时调用本方法,会触发其错误回调。
3844> 该特性依赖设备能力。
3845
3846**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3847
3848**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3849
3850**示例:**
3851
3852```ts
3853// xxx.ets
3854import { BusinessError } from '@kit.BasicServicesKit';
3855
3856@Entry
3857@Component
3858struct ImageAnalyzerExample {
3859  private settings: RenderingContextSettings = new RenderingContextSettings(true)
3860  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3861  private config: ImageAnalyzerConfig = {
3862    types: [ImageAnalyzerType.SUBJECT, ImageAnalyzerType.TEXT]
3863  }
3864  private img = new ImageBitmap('page/common/test.jpg')
3865  private aiController: ImageAnalyzerController = new ImageAnalyzerController()
3866  private options: ImageAIOptions = {
3867    types: [ImageAnalyzerType.SUBJECT, ImageAnalyzerType.TEXT],
3868    aiController: this.aiController
3869  }
3870
3871  build() {
3872    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3873      Button('start')
3874        .width(80)
3875        .height(80)
3876        .onClick(() => {
3877          this.context.startImageAnalyzer(this.config)
3878            .then(() => {
3879              console.log("analysis complete")
3880            })
3881            .catch((error: BusinessError) => {
3882              console.log("error code: " + error.code)
3883            })
3884        })
3885      Button('stop')
3886        .width(80)
3887        .height(80)
3888        .onClick(() => {
3889          this.context.stopImageAnalyzer()
3890        })
3891      Button('getTypes')
3892        .width(80)
3893        .height(80)
3894        .onClick(() => {
3895          this.aiController.getImageAnalyzerSupportTypes()
3896        })
3897      Canvas(this.context, this.options)
3898        .width(200)
3899        .height(200)
3900        .enableAnalyzer(true)
3901        .onReady(() => {
3902          this.context.drawImage(this.img, 0, 0, 200, 200)
3903        })
3904    }
3905    .width('100%')
3906    .height('100%')
3907  }
3908}
3909```
3910
3911## CanvasDirection类型说明
3912
3913**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3914
3915**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3916
3917**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3918
3919| 类型      | 说明                  |
3920| ------- | ------------------- |
3921| inherit | 继承canvas组件通用属性已设定的文本方向。 |
3922| ltr     | 从左往右。               |
3923| rtl     | 从右往左。               |
3924
3925## CanvasFillRule类型说明
3926
3927**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3928
3929**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3930
3931**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3932
3933| 类型      | 说明    |
3934| ------- | ----- |
3935| evenodd | 奇偶规则。 |
3936| nonzero | 非零规则。 |
3937
3938## CanvasLineCap类型说明
3939
3940**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3941
3942**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3943
3944**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3945
3946| 类型      | 说明                           |
3947| ------ | ----------------------------- |
3948| butt   | 线条两端为平行线,不额外扩展。               |
3949| round  | 在线条两端延伸半个圆,直径等于线宽。            |
3950| square | 在线条两端延伸一个矩形,宽度等于线宽的一半,高度等于线宽。 |
3951
3952## CanvasLineJoin类型说明
3953
3954**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3955
3956**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3957
3958**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3959
3960| 类型      | 说明                                       |
3961| ----- | ---------------------------------------- |
3962| bevel | 在线段相连处使用三角形为底填充, 每个部分矩形拐角独立。             |
3963| miter | 在相连部分的外边缘处进行延伸,使其相交于一点,形成一个菱形区域,该属性可以通过设置miterLimit属性展现效果。 |
3964| round | 在线段相连处绘制一个扇形,扇形的圆角半径是线段的宽度。              |
3965
3966## CanvasTextAlign类型说明
3967
3968**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3969
3970**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3971
3972**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3973
3974| 类型      | 说明           |
3975| ------ | ------------ |
3976| center | 文本居中对齐。      |
3977| start  | 文本对齐界线开始的地方。 |
3978| end    | 文本对齐界线结束的地方。 |
3979| left   | 文本左对齐。       |
3980| right  | 文本右对齐。       |
3981
3982## CanvasTextBaseline类型说明
3983
3984**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
3985
3986**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
3987
3988**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3989
3990| 类型      | 说明                                       |
3991| ----------- | ---------------------------------------- |
3992| alphabetic  | 文本基线是标准的字母基线。                            |
3993| bottom      | 文本基线在文本块的底部。 与ideographic基线的区别在于ideographic基线不需要考虑下行字母。 |
3994| hanging     | 文本基线是悬挂基线。                               |
3995| ideographic | 文字基线是表意字基线;如果字符本身超出了alphabetic基线,那么ideograhpic基线位置在字符本身的底部。 |
3996| middle      | 文本基线在文本块的中间。                             |
3997| top         | 文本基线在文本块的顶部。                             |
3998
3999## ImageSmoothingQuality类型说明
4000
4001**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
4002
4003**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
4004
4005**系统能力:** SystemCapability.ArkUI.ArkUI.Full
4006
4007| 类型      | 说明   |
4008| ------ | ---- |
4009| low    | 低画质  |
4010| medium | 中画质  |
4011| high   | 高画质  |
4012
4013## TextMetrics
4014
4015**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
4016
4017**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
4018
4019**系统能力:** SystemCapability.ArkUI.ArkUI.Full
4020
4021| 名称 | 类型 | 只读 | 可选 | 说明 |
4022| ---------- | -------------- | ------ | ---------------- | ------------------------ |
4023| width                    | number | 是 | 否 | 只读属性,文本方块的宽度。 |
4024| height                   | number | 是 | 否 | 只读属性,文本方块的高度。 |
4025| actualBoundingBoxAscent  | number | 是 | 否 | 只读属性,从[CanvasRenderingContext2D.textBaseline](#canvastextbaseline类型说明)属性标明的水平线到渲染文本的矩形边界顶部的距离。 |
4026| actualBoundingBoxDescent | number | 是 | 否 | 只读属性,从[CanvasRenderingContext2D.textBaseline](#canvastextbaseline类型说明)属性标明的水平线到渲染文本的矩形边界底部的距离。 |
4027| actualBoundingBoxLeft    | number | 是 | 否 | 只读属性,平行于基线,从[CanvasRenderingContext2D.textAlign](#canvastextalign类型说明)属性确定的对齐点到文本矩形边界左侧的距离。 |
4028| actualBoundingBoxRight   | number | 是 | 否 | 只读属性,平行于基线,从[CanvasRenderingContext2D.textAlign](#canvastextalign类型说明)属性确定的对齐点到文本矩形边界右侧的距离。 |
4029| alphabeticBaseline       | number | 是 | 否 | 只读属性,从[CanvasRenderingContext2D.textBaseline](#canvastextbaseline类型说明)属性标明的水平线到线框的 alphabetic 基线的距离。 |
4030| emHeightAscent           | number | 是 | 否 | 只读属性,从[CanvasRenderingContext2D.textBaseline](#canvastextbaseline类型说明)属性标明的水平线到线框中 em 方块顶部的距离。 |
4031| emHeightDescent          | number | 是 | 否 | 只读属性,从[CanvasRenderingContext2D.textBaseline](#canvastextbaseline类型说明)属性标明的水平线到线框中 em 方块底部的距离。 |
4032| fontBoundingBoxAscent    | number | 是 | 否 | 只读属性,从[CanvasRenderingContext2D.textBaseline](#canvastextbaseline类型说明)属性标明的水平线到渲染文本的所有字体的矩形最高边界顶部的距离。 |
4033| fontBoundingBoxDescent   | number | 是 | 否 | 只读属性,从[CanvasRenderingContext2D.textBaseline](#canvastextbaseline类型说明)属性标明的水平线到渲染文本的所有字体的矩形边界最底部的距离。 |
4034| hangingBaseline          | number | 是 | 否 | 只读属性,从[CanvasRenderingContext2D.textBaseline](#canvastextbaseline类型说明)属性标明的水平线到线框的 hanging 基线的距离。 |
4035| ideographicBaseline      | number | 是 | 否 | 只读属性,从[CanvasRenderingContext2D.textBaseline](#canvastextbaseline类型说明)属性标明的水平线到线框的 ideographic 基线的距离。 |
4036