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