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