• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# OffscreenCanvasRenderingContext2D
2
3使用OffscreenCanvasRenderingContext2D在Canvas上进行离屏绘制,绘制对象可以是矩形、文本、图片等。离屏绘制是指将需要绘制的内容先绘制在缓存区,然后将其转换成图片,一次性绘制到canvas上,加快了绘制速度。
4
5>  **说明:**
6>
7>  从 API Version 8 开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8
9
10
11## 接口
12
13OffscreenCanvasRenderingContext2D(width: number, height: number, settings?: RenderingContextSettings)
14
15从API version 9开始,该接口支持在ArkTS卡片中使用。
16
17**参数:**
18
19| 参数名      | 参数类型                                     | 必填   | 参数描述                           |
20| -------- | ---------------------------------------- | ---- | ------------------------------ |
21| width    | number                                   | 是    | 离屏画布的宽度,单位:vp。                        |
22| height   | number                                   | 是    | 离屏画布的高度,单位:vp。                        |
23| settings | [RenderingContextSettings](ts-canvasrenderingcontext2d.md#renderingcontextsettings) | 否    | 用来配置OffscreenCanvasRenderingContext2D对象的参数,见RenderingContextSettings接口描述。 |
24
25
26## 属性
27
28| 名称                                       | 类型                                       | 描述                                       |
29| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |
30| [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/>- 类型为number时,表示设置填充区域的颜色。<br/>-&nbsp;类型为CanvasGradient时,表示渐变对象,使用[createLinearGradient](#createlineargradient)方法创建。<br/>-&nbsp;类型为CanvasPattern时,使用[createPattern](#createpattern)方法创建。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
31| [lineWidth](#linewidth)                  | number                                   | 设置绘制线条的宽度。<br/>单位:vp。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>linewidth取值不支持0和负数,0和负数按异常值处理,异常值按默认值处理。 |
32| [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/>- 类型为number时,表示设置线条使用的颜色。<br/>-&nbsp;类型为CanvasGradient时,表示渐变对象,使用[createLinearGradient](#createlineargradient)方法创建。<br/>-&nbsp;类型为CanvasPattern时,使用[createPattern](#createpattern)方法创建。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
33| [lineCap](#linecap)                      | [CanvasLineCap](ts-canvasrenderingcontext2d.md#canvaslinecap)                            | 指定线端点的样式,可选值为:<br/>-&nbsp;'butt':线端点以方形结束。<br/>-&nbsp;'round':线端点以圆形结束。<br/>-&nbsp;'square':线端点以方形结束,该样式下会增加一个长度和线段厚度相同,宽度是线段厚度一半的矩形。<br/>默认值:'butt'。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
34| [lineJoin](#linejoin)                    | [CanvasLineJoin](ts-canvasrenderingcontext2d.md#canvaslinejoin)                           | 指定线段间相交的交点样式,可选值为:<br/>-&nbsp;'round':在线段相连处绘制一个扇形,扇形的圆角半径是线段的宽度。<br/>-&nbsp;'bevel':在线段相连处使用三角形为底填充,&nbsp;每个部分矩形拐角独立。<br/>-&nbsp;'miter':在相连部分的外边缘处进行延伸,使其相交于一点,形成一个菱形区域,该属性可以通过设置miterLimit属性展现效果。<br/>默认值:'miter'。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
35| [miterLimit](#miterlimit)                | number                                   | 设置斜接面限制值,该值指定了线条相交处内角和外角的距离。  <br/>默认值:10。<br/>单位:px。 <br/>miterLimit取值不支持0和负数,0和负数按异常值处理,异常值按默认值处理。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
36| [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'<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
37| [textAlign](#textalign)                  | [CanvasTextAlign](ts-canvasrenderingcontext2d.md#canvastextalign)                          | 设置文本绘制中的文本对齐方式,可选值为:<br/>-&nbsp;'left':文本左对齐。<br/>-&nbsp;'right':文本右对齐。<br/>-&nbsp;'center':文本居中对齐。<br/>-&nbsp;'start':文本对齐界线开始的地方。<br/>-&nbsp;'end':文本对齐界线结束的地方。<br/>> **说明:**<br/>>&nbsp;ltr布局模式下'start'和'left'一致,rtl布局模式下'start'和'right'一致·。<br/>默认值:'left'。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
38| [textBaseline](#textbaseline)            | [CanvasTextBaseline](ts-canvasrenderingcontext2d.md#canvastextbaseline)                       | 设置文本绘制中的水平对齐方式,可选值为:<br/>-&nbsp;'alphabetic':文本基线是标准的字母基线。<br/>-&nbsp;'top':文本基线在文本块的顶部。<br/>-&nbsp;'hanging':文本基线是悬挂基线。<br/>-&nbsp;'middle':文本基线在文本块的中间。<br/>-&nbsp;'ideographic':文字基线是表意字基线;如果字符本身超出了alphabetic基线,那么ideograhpic基线位置在字符本身的底部。<br/>-&nbsp;'bottom':文本基线在文本块的底部。&nbsp;与ideographic基线的区别在于ideographic基线不需要考虑下行字母。<br/>默认值:'alphabetic'。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
39| [globalAlpha](#globalalpha)              | number                                   | 设置透明度,0.0为完全透明,1.0为完全不透明。<br/>默认值:1.0。                |
40| [lineDashOffset](#linedashoffset)        | number                                   | 设置画布的虚线偏移量,精度为float。    <br/>默认值:0.0。<br/>单位:px。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
41| [globalCompositeOperation](#globalcompositeoperation) | string                                   | 设置合成操作的方式。类型字段可选值有'source-over','source-atop','source-in','source-out','destination-over','destination-atop','destination-in','destination-out','lighter','copy','xor'。<br/>-&nbsp;默认值:'source-over'。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
42| [shadowBlur](#shadowblur)                | number                                   | 设置绘制阴影时的模糊级别,值越大越模糊,精度为float。   <br/>默认值:0.0。<br/>shadowBlur取值不支持负数,负数按异常值处理,异常值按默认值处理。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
43| [shadowColor](#shadowcolor)              | string                                   | 设置绘制阴影时的阴影颜色。<br/>默认值:透明黑色。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
44| [shadowOffsetX](#shadowoffsetx)          | number                                   | 设置绘制阴影时和原有对象的水平偏移值。<br/>默认值:0。<br/>单位:vp。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
45| [shadowOffsetY](#shadowoffsety)          | number                                   | 设置绘制阴影时和原有对象的垂直偏移值。<br/>默认值:0。<br/>单位:vp。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
46| [imageSmoothingEnabled](#imagesmoothingenabled) | boolean                                  | 用于设置绘制图片时是否进行图像平滑度调整,true为启用,false为不启用。 <br/>默认值:true。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
47| [imageSmoothingQuality](#imagesmoothingquality) | [ImageSmoothingQuality](ts-canvasrenderingcontext2d.md#imagesmoothingquality-1)                    | imageSmoothingEnabled为true时,用于设置图像平滑度。可选值为:<br/>- 'low':低画质<br/>- 'medium':中画质<br/>- 'high':高画质。<br/>默认值:low<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
48| [direction](#direction)                  | [CanvasDirection](ts-canvasrenderingcontext2d.md#canvasdirection)                          | 用于设置绘制文字时使用的文字方向。可选值为:<br/>- 'inherit':继承canvas组件已设定的文本方向<br/>- 'ltr':从左往右<br/>- 'rtl':从右往左。<br/>默认值:inherit<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
49| [filter](#filter)                        | string                                   | 用于设置图像的滤镜。支持的滤镜效果如下:<br/>- 'none': 无滤镜效果<br/>- 'blur':给图像设置高斯模糊<br/>- 'brightness':给图片应用一种线性乘法,使其看起来更亮或更暗<br/>- 'contrast':调整图像的对比度<br/>- 'grayscale':将图像转换为灰度图像<br/>- 'hue-rotate':给图像应用色相旋转<br/>- 'invert':反转输入图像<br/>- 'opacity':转化图像的透明程度<br/>- 'saturate':转换图像饱和度<br/>- 'sepia':将图像转换为深褐色<br/>默认值:'none'<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
50
51> **说明:**
52> fillStyle、shadowColor与 strokeStyle 中string类型格式为 'rgb(255, 255, 255)','rgba(255, 255, 255, 1.0)','\#FFFFFF'。
53
54
55### fillStyle
56
57```ts
58// xxx.ets
59@Entry
60@Component
61struct FillStyleExample {
62  private settings: RenderingContextSettings = new RenderingContextSettings(true)
63  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
64  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
65
66  build() {
67    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
68      Canvas(this.context)
69        .width('100%')
70        .height('100%')
71        .backgroundColor('#ffff00')
72        .onReady(() =>{
73          let offContext = this.offCanvas.getContext("2d", this.settings)
74          offContext.fillStyle = '#0000ff'
75          offContext.fillRect(20, 20, 150, 100)
76          let image = this.offCanvas.transferToImageBitmap()
77          this.context.transferFromImageBitmap(image)
78        })
79    }
80    .width('100%')
81    .height('100%')
82  }
83}
84```
85
86
87
88```ts
89// xxx.ets
90@Entry
91@Component
92struct FillStyleExample {
93  private settings: RenderingContextSettings = new RenderingContextSettings(true)
94  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
95  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
96
97  build() {
98    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
99      Canvas(this.context)
100        .width('100%')
101        .height('100%')
102        .backgroundColor('#ffff00')
103        .onReady(() =>{
104          let offContext = this.offCanvas.getContext("2d", this.settings)
105          offContext.fillStyle = 0x0000FF
106          offContext.fillRect(20, 20, 150, 100)
107          let image = this.offCanvas.transferToImageBitmap()
108          this.context.transferFromImageBitmap(image)
109        })
110    }
111    .width('100%')
112    .height('100%')
113  }
114}
115```
116
117![zh-cn_image_0000001193872516](figures/zh-cn_image_0000001193872516.png)
118
119
120### lineWidth
121
122```ts
123// xxx.ets
124@Entry
125@Component
126struct LineWidthExample {
127  private settings: RenderingContextSettings = new RenderingContextSettings(true)
128  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
129  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
130
131  build() {
132    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
133      Canvas(this.context)
134        .width('100%')
135        .height('100%')
136        .backgroundColor('#ffff00')
137        .onReady(() =>{
138          let offContext = this.offCanvas.getContext("2d", this.settings)
139          offContext.lineWidth = 5
140          offContext.strokeRect(25, 25, 85, 105)
141          let image = this.offCanvas.transferToImageBitmap()
142          this.context.transferFromImageBitmap(image)
143      })
144    }
145    .width('100%')
146    .height('100%')
147  }
148}
149```
150
151![zh-cn_image_0000001238832403](figures/zh-cn_image_0000001238832403.png)
152
153
154### strokeStyle
155
156```ts
157// xxx.ets
158@Entry
159@Component
160struct StrokeStyleExample {
161  private settings: RenderingContextSettings = new RenderingContextSettings(true)
162  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
163  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
164
165  build() {
166    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
167      Canvas(this.context)
168        .width('100%')
169        .height('100%')
170        .backgroundColor('#ffff00')
171        .onReady(() =>{
172          let offContext = this.offCanvas.getContext("2d", this.settings)
173          offContext.lineWidth = 10
174          offContext.strokeStyle = '#0000ff'
175          offContext.strokeRect(25, 25, 155, 105)
176          let image = this.offCanvas.transferToImageBitmap()
177          this.context.transferFromImageBitmap(image)
178        })
179    }
180    .width('100%')
181    .height('100%')
182  }
183}
184```
185
186
187
188```ts
189// xxx.ets
190@Entry
191@Component
192struct StrokeStyleExample {
193  private settings: RenderingContextSettings = new RenderingContextSettings(true)
194  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
195  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
196
197  build() {
198    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
199      Canvas(this.context)
200        .width('100%')
201        .height('100%')
202        .backgroundColor('#ffff00')
203        .onReady(() =>{
204          let offContext = this.offCanvas.getContext("2d", this.settings)
205          offContext.lineWidth = 10
206          offContext.strokeStyle = 0x0000ff
207          offContext.strokeRect(25, 25, 155, 105)
208          let image = this.offCanvas.transferToImageBitmap()
209          this.context.transferFromImageBitmap(image)
210        })
211    }
212    .width('100%')
213    .height('100%')
214  }
215}
216```
217
218![zh-cn_image_0000001238712437](figures/zh-cn_image_0000001238712437.png)
219
220
221### lineCap
222
223```ts
224// xxx.ets
225@Entry
226@Component
227struct LineCapExample {
228  private settings: RenderingContextSettings = new RenderingContextSettings(true)
229  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
230  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
231
232  build() {
233    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
234      Canvas(this.context)
235        .width('100%')
236        .height('100%')
237        .backgroundColor('#ffff00')
238        .onReady(() =>{
239          let offContext = this.offCanvas.getContext("2d", this.settings)
240          offContext.lineWidth = 8
241          offContext.beginPath()
242          offContext.lineCap = 'round'
243          offContext.moveTo(30, 50)
244          offContext.lineTo(220, 50)
245          offContext.stroke()
246          let image = this.offCanvas.transferToImageBitmap()
247          this.context.transferFromImageBitmap(image)
248        })
249    }
250    .width('100%')
251    .height('100%')
252  }
253}
254```
255
256![zh-cn_image_0000001194192454](figures/zh-cn_image_0000001194192454.PNG)
257
258
259### lineJoin
260
261```ts
262// xxx.ets
263@Entry
264@Component
265struct LineJoinExample {
266  private settings: RenderingContextSettings = new RenderingContextSettings(true)
267  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
268  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
269
270  build() {
271    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
272      Canvas(this.context)
273        .width('100%')
274        .height('100%')
275        .backgroundColor('#ffff00')
276        .onReady(() =>{
277          let offContext = this.offCanvas.getContext("2d", this.settings)
278          offContext.beginPath()
279          offContext.lineWidth = 8
280          offContext.lineJoin = 'miter'
281          offContext.moveTo(30, 30)
282          offContext.lineTo(120, 60)
283          offContext.lineTo(30, 110)
284          offContext.stroke()
285          let image = this.offCanvas.transferToImageBitmap()
286          this.context.transferFromImageBitmap(image)
287      })
288    }
289    .width('100%')
290    .height('100%')
291  }
292}
293```
294
295![zh-cn_image_0000001194352450](figures/zh-cn_image_0000001194352450.png)
296
297
298### miterLimit
299
300```ts
301// xxx.ets
302@Entry
303@Component
304struct MiterLimit {
305  private settings: RenderingContextSettings = new RenderingContextSettings(true)
306  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
307  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
308
309  build() {
310    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
311      Canvas(this.context)
312        .width('100%')
313        .height('100%')
314        .backgroundColor('#ffff00')
315        .onReady(() =>{
316          let offContext = this.offCanvas.getContext("2d", this.settings)
317          offContext.lineWidth = 8
318          offContext.lineJoin = 'miter'
319          offContext.miterLimit = 3
320          offContext.moveTo(30, 30)
321          offContext.lineTo(60, 35)
322          offContext.lineTo(30, 37)
323          offContext.stroke()
324          let image = this.offCanvas.transferToImageBitmap()
325          this.context.transferFromImageBitmap(image)
326      })
327    }
328    .width('100%')
329    .height('100%')
330  }
331}
332```
333
334![zh-cn_image_0000001238952397](figures/zh-cn_image_0000001238952397.png)
335
336
337### font
338
339```ts
340// xxx.ets
341@Entry
342@Component
343struct Fonts {
344  private settings: RenderingContextSettings = new RenderingContextSettings(true)
345  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
346  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
347
348  build() {
349    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
350      Canvas(this.context)
351        .width('100%')
352        .height('100%')
353        .backgroundColor('#ffff00')
354        .onReady(() =>{
355          let offContext = this.offCanvas.getContext("2d", this.settings)
356          offContext.font = '30px sans-serif'
357          offContext.fillText("Hello px", 20, 60)
358          offContext.font = '30vp sans-serif'
359          offContext.fillText("Hello vp", 20, 100)
360          let image = this.offCanvas.transferToImageBitmap()
361          this.context.transferFromImageBitmap(image)
362        })
363    }
364    .width('100%')
365    .height('100%')
366  }
367}
368```
369
370![zh-cn_image_0000001194032476](figures/zh-cn_image_0000001194032476.png)
371
372
373### textAlign
374
375```ts
376// xxx.ets
377@Entry
378@Component
379struct CanvasExample {
380  private settings: RenderingContextSettings = new RenderingContextSettings(true)
381  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
382  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
383
384  build() {
385    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
386      Canvas(this.context)
387        .width('100%')
388        .height('100%')
389        .backgroundColor('#ffff00')
390        .onReady(() =>{
391        let offContext = this.offCanvas.getContext("2d", this.settings)
392        offContext.strokeStyle = '#0000ff'
393        offContext.moveTo(140, 10)
394        offContext.lineTo(140, 160)
395        offContext.stroke()
396
397        offContext.font = '18px sans-serif'
398
399        offContext.textAlign = 'start'
400        offContext.fillText('textAlign=start', 140, 60)
401        offContext.textAlign = 'end'
402        offContext.fillText('textAlign=end', 140, 80)
403        offContext.textAlign = 'left'
404        offContext.fillText('textAlign=left', 140, 100)
405        offContext.textAlign = 'center'
406        offContext.fillText('textAlign=center',140, 120)
407        offContext.textAlign = 'right'
408        offContext.fillText('textAlign=right',140, 140)
409        let image = this.offCanvas.transferToImageBitmap()
410        this.context.transferFromImageBitmap(image)
411      })
412    }
413    .width('100%')
414    .height('100%')
415  }
416}
417```
418
419![zh-cn_image_0000001239032423](figures/zh-cn_image_0000001239032423.png)
420
421
422### textBaseline
423
424```ts
425// xxx.ets
426@Entry
427@Component
428struct TextBaseline {
429  private settings: RenderingContextSettings = new RenderingContextSettings(true)
430  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
431  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
432
433  build() {
434    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
435      Canvas(this.context)
436        .width('100%')
437        .height('100%')
438        .backgroundColor('#ffff00')
439        .onReady(() =>{
440          let offContext = this.offCanvas.getContext("2d", this.settings)
441          offContext.strokeStyle = '#0000ff'
442          offContext.moveTo(0, 120)
443          offContext.lineTo(400, 120)
444          offContext.stroke()
445
446          offContext.font = '20px sans-serif'
447
448          offContext.textBaseline = 'top'
449          offContext.fillText('Top', 10, 120)
450          offContext.textBaseline = 'bottom'
451          offContext.fillText('Bottom', 55, 120)
452          offContext.textBaseline = 'middle'
453          offContext.fillText('Middle', 125, 120)
454          offContext.textBaseline = 'alphabetic'
455          offContext.fillText('Alphabetic', 195, 120)
456          offContext.textBaseline = 'hanging'
457          offContext.fillText('Hanging', 295, 120)
458          let image = this.offCanvas.transferToImageBitmap()
459          this.context.transferFromImageBitmap(image)
460      })
461    }
462    .width('100%')
463    .height('100%')
464  }
465}
466```
467
468![zh-cn_image_0000001193872518](figures/zh-cn_image_0000001193872518.png)
469
470
471### globalAlpha
472
473```ts
474// xxx.ets
475@Entry
476@Component
477struct GlobalAlpha {
478  private settings: RenderingContextSettings = new RenderingContextSettings(true)
479  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
480  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
481
482  build() {
483    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
484      Canvas(this.context)
485        .width('100%')
486        .height('100%')
487        .backgroundColor('#ffff00')
488        .onReady(() =>{
489          let offContext = this.offCanvas.getContext("2d", this.settings)
490          offContext.fillStyle = 'rgb(0,0,255)'
491          offContext.fillRect(0, 0, 50, 50)
492          offContext.globalAlpha = 0.4
493          offContext.fillStyle = 'rgb(0,0,255)'
494          offContext.fillRect(50, 50, 50, 50)
495          let image = this.offCanvas.transferToImageBitmap()
496          this.context.transferFromImageBitmap(image)
497      })
498    }
499    .width('100%')
500    .height('100%')
501  }
502}
503```
504
505![zh-cn_image_0000001238832405](figures/zh-cn_image_0000001238832405.png)
506
507
508### lineDashOffset
509
510```ts
511// xxx.ets
512@Entry
513@Component
514struct LineDashOffset {
515  private settings: RenderingContextSettings = new RenderingContextSettings(true)
516  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
517  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
518
519  build() {
520    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
521      Canvas(this.context)
522        .width('100%')
523        .height('100%')
524        .backgroundColor('#ffff00')
525        .onReady(() =>{
526          let offContext = this.offCanvas.getContext("2d", this.settings)
527          offContext.arc(100, 75, 50, 0, 6.28)
528          offContext.setLineDash([10,20])
529          offContext.lineDashOffset = 10.0
530          offContext.stroke()
531          let image = this.offCanvas.transferToImageBitmap()
532          this.context.transferFromImageBitmap(image)
533      })
534    }
535    .width('100%')
536    .height('100%')
537  }
538}
539
540```
541![zh-cn_image_0000001238712439](figures/zh-cn_image_0000001238712439.png)
542
543
544### globalCompositeOperation
545
546| 名称               | 描述                       |
547| ---------------- | ------------------------ |
548| source-over      | 在现有绘制内容上显示新绘制内容,属于默认值。   |
549| source-atop      | 在现有绘制内容顶部显示新绘制内容。        |
550| source-in        | 在现有绘制内容中显示新绘制内容。         |
551| source-out       | 在现有绘制内容之外显示新绘制内容。        |
552| destination-over | 在新绘制内容上方显示现有绘制内容。        |
553| destination-atop | 在新绘制内容顶部显示现有绘制内容。        |
554| destination-in   | 在新绘制内容中显示现有绘制内容。         |
555| destination-out  | 在新绘制内容外显示现有绘制内容。         |
556| lighter          | 显示新绘制内容和现有绘制内容。          |
557| copy             | 显示新绘制内容而忽略现有绘制内容。        |
558| xor              | 使用异或操作对新绘制内容与现有绘制内容进行融合。 |
559
560```ts
561// xxx.ets
562@Entry
563@Component
564struct GlobalCompositeOperation {
565  private settings: RenderingContextSettings = new RenderingContextSettings(true)
566  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
567  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
568
569  build() {
570    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
571      Canvas(this.context)
572        .width('100%')
573        .height('100%')
574        .backgroundColor('#ffff00')
575        .onReady(() =>{
576          let offContext = this.offCanvas.getContext("2d", this.settings)
577          offContext.fillStyle = 'rgb(255,0,0)'
578          offContext.fillRect(20, 20, 50, 50)
579          offContext.globalCompositeOperation = 'source-over'
580          offContext.fillStyle = 'rgb(0,0,255)'
581          offContext.fillRect(50, 50, 50, 50)
582          offContext.fillStyle = 'rgb(255,0,0)'
583          offContext.fillRect(120, 20, 50, 50)
584          offContext.globalCompositeOperation = 'destination-over'
585          offContext.fillStyle = 'rgb(0,0,255)'
586          offContext.fillRect(150, 50, 50, 50)
587          let image = this.offCanvas.transferToImageBitmap()
588          this.context.transferFromImageBitmap(image)
589      })
590    }
591    .width('100%')
592    .height('100%')
593  }
594}
595```
596
597![zh-cn_image_0000001194192456](figures/zh-cn_image_0000001194192456.png)
598
599
600### shadowBlur
601
602```ts
603// xxx.ets
604@Entry
605@Component
606struct ShadowBlur {
607  private settings: RenderingContextSettings = new RenderingContextSettings(true)
608  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
609  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
610
611  build() {
612    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
613      Canvas(this.context)
614        .width('100%')
615        .height('100%')
616        .backgroundColor('#ffff00')
617        .onReady(() =>{
618          let offContext = this.offCanvas.getContext("2d", this.settings)
619          offContext.shadowBlur = 30
620          offContext.shadowColor = 'rgb(0,0,0)'
621          offContext.fillStyle = 'rgb(255,0,0)'
622          offContext.fillRect(20, 20, 100, 80)
623          let image = this.offCanvas.transferToImageBitmap()
624          this.context.transferFromImageBitmap(image)
625      })
626    }
627    .width('100%')
628    .height('100%')
629  }
630}
631```
632
633![zh-cn_image_0000001194352452](figures/zh-cn_image_0000001194352452.png)
634
635
636### shadowColor
637
638```ts
639// xxx.ets
640@Entry
641@Component
642struct ShadowColor {
643  private settings: RenderingContextSettings = new RenderingContextSettings(true)
644  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
645  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
646
647  build() {
648    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
649      Canvas(this.context)
650        .width('100%')
651        .height('100%')
652        .backgroundColor('#ffff00')
653        .onReady(() =>{
654          let offContext = this.offCanvas.getContext("2d", this.settings)
655          offContext.shadowBlur = 30
656          offContext.shadowColor = 'rgb(0,0,255)'
657          offContext.fillStyle = 'rgb(255,0,0)'
658          offContext.fillRect(30, 30, 100, 100)
659          let image = this.offCanvas.transferToImageBitmap()
660          this.context.transferFromImageBitmap(image)
661      })
662    }
663    .width('100%')
664    .height('100%')
665  }
666}
667```
668
669![zh-cn_image_0000001238952399](figures/zh-cn_image_0000001238952399.png)
670
671
672### shadowOffsetX
673
674```ts
675// xxx.ets
676@Entry
677@Component
678struct ShadowOffsetX {
679  private settings: RenderingContextSettings = new RenderingContextSettings(true)
680  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
681  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
682
683  build() {
684    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
685      Canvas(this.context)
686        .width('100%')
687        .height('100%')
688        .backgroundColor('#ffff00')
689        .onReady(() =>{
690          let offContext = this.offCanvas.getContext("2d", this.settings)
691          offContext.shadowBlur = 10
692          offContext.shadowOffsetX = 20
693          offContext.shadowColor = 'rgb(0,0,0)'
694          offContext.fillStyle = 'rgb(255,0,0)'
695          offContext.fillRect(20, 20, 100, 80)
696          let image = this.offCanvas.transferToImageBitmap()
697          this.context.transferFromImageBitmap(image)
698      })
699    }
700    .width('100%')
701    .height('100%')
702  }
703}
704```
705
706![zh-cn_image_0000001194032478](figures/zh-cn_image_0000001194032478.png)
707
708
709### shadowOffsetY
710
711```ts
712// xxx.ets
713@Entry
714@Component
715struct ShadowOffsetY {
716  private settings: RenderingContextSettings = new RenderingContextSettings(true)
717  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
718  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
719
720  build() {
721    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
722      Canvas(this.context)
723        .width('100%')
724        .height('100%')
725        .backgroundColor('#ffff00')
726        .onReady(() =>{
727          let offContext = this.offCanvas.getContext("2d", this.settings)
728          offContext.shadowBlur = 10
729          offContext.shadowOffsetY = 20
730          offContext.shadowColor = 'rgb(0,0,0)'
731          offContext.fillStyle = 'rgb(255,0,0)'
732          offContext.fillRect(30, 30, 100, 100)
733          let image = this.offCanvas.transferToImageBitmap()
734          this.context.transferFromImageBitmap(image)
735      })
736    }
737    .width('100%')
738    .height('100%')
739  }
740}
741```
742
743![zh-cn_image_0000001239032425](figures/zh-cn_image_0000001239032425.png)
744
745
746### imageSmoothingEnabled
747
748```ts
749// xxx.ets
750@Entry
751@Component
752struct ImageSmoothingEnabled {
753  private settings: RenderingContextSettings = new RenderingContextSettings(true)
754  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
755  private img:ImageBitmap = new ImageBitmap("common/images/icon.jpg")
756  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
757
758  build() {
759    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
760      Canvas(this.context)
761        .width('100%')
762        .height('100%')
763        .backgroundColor('#ffff00')
764        .onReady(() =>{
765          let offContext = this.offCanvas.getContext("2d", this.settings)
766          offContext.imageSmoothingEnabled = false
767          offContext.drawImage(this.img,0,0,400,200)
768          let image = this.offCanvas.transferToImageBitmap()
769          this.context.transferFromImageBitmap(image)
770      })
771    }
772    .width('100%')
773    .height('100%')
774  }
775}
776```
777
778![zh-cn_image_0000001193872520](figures/zh-cn_image_0000001193872520.png)
779
780
781### imageSmoothingQuality
782
783```ts
784  // xxx.ets
785  @Entry
786  @Component
787  struct ImageSmoothingQualityDemoOff {
788    private settings: RenderingContextSettings = new RenderingContextSettings(true);
789    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.
790settings);
791    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
792    private img:ImageBitmap = new ImageBitmap("common/images/example.jpg");
793
794    build() {
795      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,
796justifyContent: FlexAlign.Center }) {
797        Canvas(this.context)
798          .width('100%')
799          .height('100%')
800          .backgroundColor('#ffff00')
801          .onReady(() =>{
802            let offContext = this.offCanvas.getContext("2d", this.settings)
803            let offctx = offContext
804            offctx.imageSmoothingEnabled = true
805            offctx.imageSmoothingQuality = 'high'
806            offctx.drawImage(this.img, 0, 0, 400, 200)
807
808            let image = this.offCanvas.transferToImageBitmap()
809            this.context.transferFromImageBitmap(image)
810          })
811      }
812      .width('100%')
813      .height('100%')
814    }
815  }
816```
817
818![ImageSmoothingQualityDemo](figures/ImageSmoothingQualityDemo.jpeg)
819
820### direction
821
822```ts
823  // xxx.ets
824  @Entry
825  @Component
826  struct DirectionDemoOff {
827    private settings: RenderingContextSettings = new RenderingContextSettings(true);
828    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.
829settings);
830    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
831
832    build() {
833      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,
834justifyContent: FlexAlign.Center }) {
835        Canvas(this.context)
836          .width('100%')
837          .height('100%')
838          .backgroundColor('#ffff00')
839          .onReady(() =>{
840            let offContext = this.offCanvas.getContext("2d", this.settings)
841            let offctx = offContext
842            offctx.font = '48px serif';
843            offctx.textAlign = 'start'
844            offctx.fillText("Hi ltr!", 200, 50);
845
846            offctx.direction = "rtl";
847            offctx.fillText("Hi rtl!", 200, 100);
848
849            let image = offctx.transferToImageBitmap()
850            this.context.transferFromImageBitmap(image)
851          })
852      }
853      .width('100%')
854      .height('100%')
855    }
856  }
857```
858
859![directionDemo](figures/directionDemo.jpeg)
860
861### filter
862
863```ts
864  // xxx.ets
865  @Entry
866  @Component
867  struct FilterDemoOff {
868    private settings: RenderingContextSettings = new RenderingContextSettings(true);
869    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
870    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
871    private img:ImageBitmap = new ImageBitmap("common/images/example.jpg");
872
873    build() {
874      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.
875Center }) {
876        Canvas(this.context)
877          .width('100%')
878          .height('100%')
879          .backgroundColor('#ffff00')
880          .onReady(() =>{
881            let offContext = this.offCanvas.getContext("2d", this.settings)
882            let offctx = offContext
883            let img = this.img
884
885            offctx.drawImage(img, 0, 0, 100, 100);
886
887            offctx.filter = 'grayscale(50%)';
888            offctx.drawImage(img, 100, 0, 100, 100);
889
890            offctx.filter = 'sepia(60%)';
891            offctx.drawImage(img, 200, 0, 100, 100);
892
893            offctx.filter = 'saturate(30%)';
894            offctx.drawImage(img, 0, 100, 100, 100);
895
896            offctx.filter = 'hue-rotate(90degree)';
897            offctx.drawImage(img, 100, 100, 100, 100);
898
899            offctx.filter = 'invert(100%)';
900            offctx.drawImage(img, 200, 100, 100, 100);
901
902            offctx.filter = 'opacity(25%)';
903            offctx.drawImage(img, 0, 200, 100, 100);
904
905            offctx.filter = 'brightness(0.4)';
906            offctx.drawImage(img, 100, 200, 100, 100);
907
908            offctx.filter = 'contrast(200%)';
909            offctx.drawImage(img, 200, 200, 100, 100);
910
911            offctx.filter = 'blur(5px)';
912            offctx.drawImage(img, 0, 300, 100, 100);
913
914            let image = this.offCanvas.transferToImageBitmap()
915            this.context.transferFromImageBitmap(image)
916          })
917      }
918      .width('100%')
919      .height('100%')
920    }
921  }
922```
923
924![filterDemo](figures/filterDemo.jpeg)
925
926## 方法
927
928
929### fillRect
930
931fillRect(x: number, y: number, w: number, h: number): void
932
933填充一个矩形。
934
935从API version 9开始,该接口支持在ArkTS卡片中使用。
936
937 **参数:**
938
939| 参数     | 类型     | 必填   | 默认值  | 说明            |
940| ------ | ------ | ---- | ---- | ------------- |
941| x      | number | 是    | 0    | 指定矩形左上角点的x坐标,单位:vp。 |
942| y      | number | 是    | 0    | 指定矩形左上角点的y坐标,单位:vp。 |
943| w      | number | 是    | 0    | 指定矩形的宽度,单位:vp。      |
944| h      | number | 是    | 0    | 指定矩形的高度,单位:vp。      |
945
946 **示例:**
947
948  ```ts
949  // xxx.ets
950  @Entry
951  @Component
952  struct FillRect {
953    private settings: RenderingContextSettings = new RenderingContextSettings(true)
954    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
955    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
956
957    build() {
958      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
959        Canvas(this.context)
960          .width('100%')
961          .height('100%')
962          .backgroundColor('#ffff00')
963          .onReady(() =>{
964            let offContext = this.offCanvas.getContext("2d", this.settings)
965            offContext.fillRect(30,30,100,100)
966            let image = this.offCanvas.transferToImageBitmap()
967            this.context.transferFromImageBitmap(image)
968         })
969        }
970      .width('100%')
971      .height('100%')
972    }
973  }
974  ```
975
976  ![zh-cn_image_0000001194192436](figures/zh-cn_image_0000001194192436.png)
977
978
979### strokeRect
980
981strokeRect(x: number, y: number, w: number, h: number): void
982
983绘制具有边框的矩形,矩形内部不填充。
984
985从API version 9开始,该接口支持在ArkTS卡片中使用。
986
987 **参数:**
988
989| 参数     | 类型     | 必填   | 默认值  | 说明           |
990| ------ | ------ | ---- | ---- | ------------ |
991| x      | number | 是    | 0    | 指定矩形的左上角x坐标,单位:vp。 |
992| y      | number | 是    | 0    | 指定矩形的左上角y坐标,单位:vp。 |
993| width  | number | 是    | 0    | 指定矩形的宽度,单位:vp。     |
994| height | number | 是    | 0    | 指定矩形的高度,单位:vp。     |
995
996 **示例:**
997
998  ```ts
999  // xxx.ets
1000  @Entry
1001  @Component
1002  struct StrokeRect {
1003    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1004    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1005    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1006
1007    build() {
1008      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1009        Canvas(this.context)
1010          .width('100%')
1011          .height('100%')
1012          .backgroundColor('#ffff00')
1013          .onReady(() =>{
1014            let offContext = this.offCanvas.getContext("2d", this.settings)
1015            offContext.strokeRect(30, 30, 200, 150)
1016            let image = this.offCanvas.transferToImageBitmap()
1017            this.context.transferFromImageBitmap(image)
1018        })
1019      }
1020      .width('100%')
1021      .height('100%')
1022    }
1023  }
1024  ```
1025
1026  ![zh-cn_image_0000001194352436](figures/zh-cn_image_0000001194352436.png)
1027
1028
1029### clearRect
1030
1031clearRect(x: number, y: number, w: number, h: number): void
1032
1033删除指定区域内的绘制内容。
1034
1035从API version 9开始,该接口支持在ArkTS卡片中使用。
1036
1037 **参数:**
1038
1039| 参数     | 类型     | 必填   | 默认值  | 描述            |
1040| ------ | ------ | ---- | ---- | ------------- |
1041| x      | number | 是    | 0    | 指定矩形上的左上角x坐标,单位:vp。 |
1042| y      | number | 是    | 0    | 指定矩形上的左上角y坐标,单位:vp。 |
1043| width  | number | 是    | 0    | 指定矩形的宽度,单位:vp。      |
1044| height | number | 是    | 0    | 指定矩形的高度,单位:vp。      |
1045
1046 **示例:**
1047
1048  ```ts
1049  // xxx.ets
1050  @Entry
1051  @Component
1052  struct ClearRect {
1053    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1054    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1055    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1056
1057    build() {
1058      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1059        Canvas(this.context)
1060          .width('100%')
1061          .height('100%')
1062          .backgroundColor('#ffff00')
1063          .onReady(() =>{
1064            let offContext = this.offCanvas.getContext("2d", this.settings)
1065            offContext.fillStyle = 'rgb(0,0,255)'
1066            offContext.fillRect(20,20,200,200)
1067            offContext.clearRect(30,30,150,100)
1068            let image = this.offCanvas.transferToImageBitmap()
1069            this.context.transferFromImageBitmap(image)
1070        })
1071      }
1072      .width('100%')
1073      .height('100%')
1074    }
1075  }
1076  ```
1077
1078  ![zh-cn_image_0000001238952377](figures/zh-cn_image_0000001238952377.png)
1079
1080
1081### fillText
1082
1083fillText(text: string, x: number, y: number, maxWidth?: number): void
1084
1085绘制填充类文本。
1086
1087从API version 9开始,该接口支持在ArkTS卡片中使用。
1088
1089**参数:**
1090
1091| 参数       | 类型     | 必填   | 默认值  | 说明              |
1092| -------- | ------ | ---- | ---- | --------------- |
1093| text     | string | 是    | ""   | 需要绘制的文本内容。      |
1094| x        | number | 是    | 0    | 需要绘制的文本的左下角x坐标,单位:vp。 |
1095| y        | number | 是    | 0    | 需要绘制的文本的左下角y坐标,单位:vp。 |
1096| maxWidth | number | 否    | -    | 指定文本允许的最大宽度,单位:vp。    |
1097
1098 **示例:**
1099
1100  ```ts
1101  // xxx.ets
1102  @Entry
1103  @Component
1104  struct FillText {
1105    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1106    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1107    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1108
1109    build() {
1110      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1111        Canvas(this.context)
1112          .width('100%')
1113          .height('100%')
1114          .backgroundColor('#ffff00')
1115          .onReady(() =>{
1116            let offContext = this.offCanvas.getContext("2d", this.settings)
1117            offContext.font = '30px sans-serif'
1118            offContext.fillText("Hello World!", 20, 100)
1119            let image = this.offCanvas.transferToImageBitmap()
1120            this.context.transferFromImageBitmap(image)
1121        })
1122      }
1123      .width('100%')
1124      .height('100%')
1125    }
1126  }
1127  ```
1128
1129  ![zh-cn_image_0000001194032458](figures/zh-cn_image_0000001194032458.png)
1130
1131
1132### strokeText
1133
1134strokeText(text: string, x: number, y: number): void
1135
1136绘制描边类文本。
1137
1138从API version 9开始,该接口支持在ArkTS卡片中使用。
1139
1140**参数:**
1141
1142| 参数       | 类型     | 必填   | 默认值  | 描述              |
1143| -------- | ------ | ---- | ---- | --------------- |
1144| text     | string | 是    | ""   | 需要绘制的文本内容。      |
1145| x        | number | 是    | 0    | 需要绘制的文本的左下角x坐标,单位:vp。 |
1146| y        | number | 是    | 0    | 需要绘制的文本的左下角y坐标,单位:vp。 |
1147| maxWidth | number | 否    | -    | 需要绘制的文本的最大宽度,单位:vp。  |
1148
1149 **示例:**
1150
1151  ```ts
1152  // xxx.ets
1153  @Entry
1154  @Component
1155  struct StrokeText {
1156    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1157    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1158    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1159
1160    build() {
1161      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1162        Canvas(this.context)
1163          .width('100%')
1164          .height('100%')
1165          .backgroundColor('#ffff00')
1166          .onReady(() =>{
1167            let offContext = this.offCanvas.getContext("2d", this.settings)
1168            offContext.font = '55px sans-serif'
1169            offContext.strokeText("Hello World!", 20, 60)
1170            let image = this.offCanvas.transferToImageBitmap()
1171            this.context.transferFromImageBitmap(image)
1172        })
1173      }
1174      .width('100%')
1175      .height('100%')
1176    }
1177  }
1178  ```
1179
1180  ![zh-cn_image_0000001238952401](figures/zh-cn_image_0000001238952401.png)
1181
1182
1183### measureText
1184
1185measureText(text: string): TextMetrics
1186
1187该方法返回一个文本测算的对象,通过该对象可以获取指定文本的宽度值。
1188
1189从API version 9开始,该接口支持在ArkTS卡片中使用。
1190
1191 **参数:**
1192
1193| 参数   | 类型     | 必填   | 默认值  | 说明         |
1194| ---- | ------ | ---- | ---- | ---------- |
1195| text | string | 是    | ""   | 需要进行测量的文本。 |
1196
1197 **返回值:**
1198
1199| 类型          | 说明                                       |
1200| ----------- | ---------------------------------------- |
1201| [TextMetrics](ts-canvasrenderingcontext2d.md#textmetrics) | 文本的尺寸信息。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
1202
1203 **示例:**
1204
1205  ```ts
1206  // xxx.ets
1207  @Entry
1208  @Component
1209  struct MeasureText {
1210    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1211    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1212    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1213
1214    build() {
1215      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1216        Canvas(this.context)
1217          .width('100%')
1218          .height('100%')
1219          .backgroundColor('#ffff00')
1220          .onReady(() =>{
1221            let offContext = this.offCanvas.getContext("2d", this.settings)
1222            offContext.font = '50px sans-serif'
1223            offContext.fillText("Hello World!", 20, 100)
1224            offContext.fillText("width:" + this.context.measureText("Hello World!").width, 20, 200)
1225            let image = this.offCanvas.transferToImageBitmap()
1226            this.context.transferFromImageBitmap(image)
1227        })
1228      }
1229      .width('100%')
1230      .height('100%')
1231    }
1232  }
1233  ```
1234
1235  ![zh-cn_image_0000001194032480](figures/zh-cn_image_0000001194032480.png)
1236
1237
1238### stroke
1239
1240stroke(path?: Path2D): void
1241
1242进行边框绘制操作。
1243
1244从API version 9开始,该接口支持在ArkTS卡片中使用。
1245
1246 **参数:**
1247
1248| 参数   | 类型                                       | 必填   | 默认值  | 描述           |
1249| ---- | ---------------------------------------- | ---- | ---- | ------------ |
1250| path | [Path2D](ts-components-canvas-path2d.md) | 否    | null | 需要绘制的Path2D。 |
1251
1252 **示例:**
1253
1254  ```ts
1255  // xxx.ets
1256  @Entry
1257  @Component
1258  struct Stroke {
1259    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1260    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1261    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1262
1263    build() {
1264      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1265        Canvas(this.context)
1266          .width('100%')
1267          .height('100%')
1268          .backgroundColor('#ffff00')
1269          .onReady(() =>{
1270            let offContext = this.offCanvas.getContext("2d", this.settings)
1271            offContext.moveTo(25, 25)
1272            offContext.lineTo(25, 105)
1273            offContext.lineTo(75, 105)
1274            offContext.lineTo(75, 25)
1275            offContext.strokeStyle = 'rgb(0,0,255)'
1276            offContext.stroke()
1277            let image = this.offCanvas.transferToImageBitmap()
1278            this.context.transferFromImageBitmap(image)
1279          })
1280      }
1281      .width('100%')
1282      .height('100%')
1283    }
1284  }
1285  ```
1286
1287  ![zh-cn_image_0000001238832389](figures/zh-cn_image_0000001238832389.png)
1288
1289
1290### beginPath
1291
1292beginPath(): void
1293
1294创建一个新的绘制路径。
1295
1296从API version 9开始,该接口支持在ArkTS卡片中使用。
1297
1298 **示例:**
1299
1300  ```ts
1301  // xxx.ets
1302  @Entry
1303  @Component
1304  struct BeginPath {
1305    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1306    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1307    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1308
1309    build() {
1310      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1311        Canvas(this.context)
1312          .width('100%')
1313          .height('100%')
1314          .backgroundColor('#ffff00')
1315          .onReady(() =>{
1316            let offContext = this.offCanvas.getContext("2d", this.settings)
1317            offContext.beginPath()
1318            offContext.lineWidth = 6
1319            offContext.strokeStyle = '#0000ff'
1320            offContext.moveTo(15, 80)
1321            offContext.lineTo(280, 160)
1322            offContext.stroke()
1323            let image = this.offCanvas.transferToImageBitmap()
1324            this.context.transferFromImageBitmap(image)
1325          })
1326      }
1327      .width('100%')
1328      .height('100%')
1329    }
1330  }
1331  ```
1332
1333  ![zh-cn_image_0000001193872522](figures/zh-cn_image_0000001193872522.png)
1334
1335
1336### moveTo
1337
1338moveTo(x: number, y: number): void
1339
1340路径从当前点移动到指定点。
1341
1342从API version 9开始,该接口支持在ArkTS卡片中使用。
1343
1344 **参数:**
1345
1346| 参数   | 类型     | 必填   | 默认值  | 说明        |
1347| ---- | ------ | ---- | ---- | --------- |
1348| x    | number | 是    | 0    | 指定位置的x坐标,单位:vp。 |
1349| y    | number | 是    | 0    | 指定位置的y坐标,单位:vp。 |
1350
1351 **示例:**
1352
1353  ```ts
1354  // xxx.ets
1355  @Entry
1356  @Component
1357  struct MoveTo {
1358    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1359    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1360    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1361
1362    build() {
1363      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1364        Canvas(this.context)
1365          .width('100%')
1366          .height('100%')
1367          .backgroundColor('#ffff00')
1368          .onReady(() =>{
1369            let offContext = this.offCanvas.getContext("2d", this.settings)
1370            offContext.beginPath()
1371            offContext.moveTo(10, 10)
1372            offContext.lineTo(280, 160)
1373            offContext.stroke()
1374            let image = this.offCanvas.transferToImageBitmap()
1375            this.context.transferFromImageBitmap(image)
1376          })
1377      }
1378      .width('100%')
1379      .height('100%')
1380    }
1381  }
1382  ```
1383
1384  ![zh-cn_image_0000001238832409](figures/zh-cn_image_0000001238832409.png)
1385
1386
1387### lineTo
1388
1389lineTo(x: number, y: number): void
1390
1391从当前点到指定点进行路径连接。
1392
1393从API version 9开始,该接口支持在ArkTS卡片中使用。
1394
1395 **参数:**
1396
1397| 参数   | 类型     | 必填   | 默认值  | 描述        |
1398| ---- | ------ | ---- | ---- | --------- |
1399| x    | number | 是    | 0    | 指定位置的x坐标,单位:vp。 |
1400| y    | number | 是    | 0    | 指定位置的y坐标,单位:vp。 |
1401
1402 **示例:**
1403
1404  ```ts
1405  // xxx.ets
1406  @Entry
1407  @Component
1408  struct LineTo {
1409    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1410    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1411    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1412
1413    build() {
1414      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1415        Canvas(this.context)
1416          .width('100%')
1417          .height('100%')
1418          .backgroundColor('#ffff00')
1419          .onReady(() =>{
1420            let offContext = this.offCanvas.getContext("2d", this.settings)
1421            offContext.beginPath()
1422            offContext.moveTo(10, 10)
1423            offContext.lineTo(280, 160)
1424            offContext.stroke()
1425            let image = this.offCanvas.transferToImageBitmap()
1426            this.context.transferFromImageBitmap(image)
1427          })
1428      }
1429      .width('100%')
1430      .height('100%')
1431    }
1432  }
1433  ```
1434
1435  ![zh-cn_image_0000001238712443](figures/zh-cn_image_0000001238712443.png)
1436
1437
1438### closePath
1439
1440closePath(): void
1441
1442结束当前路径形成一个封闭路径。
1443
1444从API version 9开始,该接口支持在ArkTS卡片中使用。
1445
1446 **示例:**
1447
1448  ```ts
1449  // xxx.ets
1450  @Entry
1451  @Component
1452  struct ClosePath {
1453    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1454    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1455    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1456
1457    build() {
1458      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1459        Canvas(this.context)
1460          .width('100%')
1461          .height('100%')
1462          .backgroundColor('#ffff00')
1463          .onReady(() =>{
1464              let offContext = this.offCanvas.getContext("2d", this.settings)
1465              offContext.beginPath()
1466              offContext.moveTo(30, 30)
1467              offContext.lineTo(110, 30)
1468              offContext.lineTo(70, 90)
1469              offContext.closePath()
1470              offContext.stroke()
1471              let image = this.offCanvas.transferToImageBitmap()
1472              this.context.transferFromImageBitmap(image)
1473          })
1474      }
1475      .width('100%')
1476      .height('100%')
1477    }
1478  }
1479  ```
1480
1481  ![zh-cn_image_0000001194192460](figures/zh-cn_image_0000001194192460.png)
1482
1483
1484### createPattern
1485
1486createPattern(image: ImageBitmap, repetition: string | null): CanvasPattern | null
1487
1488通过指定图像和重复方式创建图片填充的模板。
1489
1490从API version 9开始,该接口支持在ArkTS卡片中使用。
1491
1492**参数:**
1493
1494| 参数         | 类型                                       | 必填   | 默认值  | 描述                                       |
1495| ---------- | ---------------------------------------- | ---- | ---- | ---------------------------------------- |
1496| image      | [ImageBitmap](ts-components-canvas-imagebitmap.md) | 是    | null | 图源对象,具体参考ImageBitmap对象。                  |
1497| repetition | string \| null                                   | 是    | “”   | 设置图像重复的方式,取值为:'repeat'、'repeat-x'、&nbsp;'repeat-y'、'no-repeat'、'clamp'、'mirror'。 |
1498
1499**返回值:**
1500
1501| 类型                                       | 说明                      |
1502| ---------------------------------------- | ----------------------- |
1503| [CanvasPattern](ts-components-canvas-canvaspattern.md#canvaspattern) \| null | 通过指定图像和重复方式创建图片填充的模板对象。 |
1504
1505 **示例:**
1506
1507  ```ts
1508  // xxx.ets
1509  @Entry
1510  @Component
1511  struct CreatePattern {
1512    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1513    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1514    private img:ImageBitmap = new ImageBitmap("common/images/icon.jpg")
1515    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1516
1517    build() {
1518      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1519        Canvas(this.context)
1520          .width('100%')
1521          .height('100%')
1522          .backgroundColor('#ffff00')
1523          .onReady(() =>{
1524            let offContext = this.offCanvas.getContext("2d", this.settings)
1525            let pattern = offContext.createPattern(this.img, 'repeat')
1526            offContext.fillStyle = pattern as CanvasPattern
1527            offContext.fillRect(0, 0, 200, 200)
1528            let image = this.offCanvas.transferToImageBitmap()
1529            this.context.transferFromImageBitmap(image)
1530          })
1531      }
1532      .width('100%')
1533      .height('100%')
1534    }
1535  }
1536  ```
1537
1538  ![zh-cn_image_0000001194352456](figures/zh-cn_image_0000001194352456.png)
1539
1540
1541### bezierCurveTo
1542
1543bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void
1544
1545创建三次贝赛尔曲线的路径。
1546
1547从API version 9开始,该接口支持在ArkTS卡片中使用。
1548
1549 **参数:**
1550
1551| 参数   | 类型     | 必填   | 默认值  | 描述             |
1552| ---- | ------ | ---- | ---- | -------------- |
1553| cp1x | number | 是    | 0    | 第一个贝塞尔参数的x坐标值,单位:vp。 |
1554| cp1y | number | 是    | 0    | 第一个贝塞尔参数的y坐标值,单位:vp。 |
1555| cp2x | number | 是    | 0    | 第二个贝塞尔参数的x坐标值,单位:vp。 |
1556| cp2y | number | 是    | 0    | 第二个贝塞尔参数的y坐标值,单位:vp。 |
1557| x    | number | 是    | 0    | 路径结束时的x坐标值,单位:vp。    |
1558| y    | number | 是    | 0    | 路径结束时的y坐标值,单位:vp。    |
1559
1560 **示例:**
1561
1562  ```ts
1563  // xxx.ets
1564  @Entry
1565  @Component
1566  struct BezierCurveTo {
1567    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1568    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1569    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1570
1571    build() {
1572      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1573        Canvas(this.context)
1574          .width('100%')
1575          .height('100%')
1576          .backgroundColor('#ffff00')
1577          .onReady(() =>{
1578            let offContext = this.offCanvas.getContext("2d", this.settings)
1579            offContext.beginPath()
1580            offContext.moveTo(10, 10)
1581            offContext.bezierCurveTo(20, 100, 200, 100, 200, 20)
1582            offContext.stroke()
1583            let image = this.offCanvas.transferToImageBitmap()
1584            this.context.transferFromImageBitmap(image)
1585          })
1586      }
1587      .width('100%')
1588      .height('100%')
1589    }
1590  }
1591  ```
1592
1593  ![zh-cn_image_0000001238952403](figures/zh-cn_image_0000001238952403.png)
1594
1595
1596### quadraticCurveTo
1597
1598quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void
1599
1600创建二次贝赛尔曲线的路径。
1601
1602从API version 9开始,该接口支持在ArkTS卡片中使用。
1603
1604 **参数:**
1605
1606| 参数   | 类型     | 必填   | 默认值  | 描述          |
1607| ---- | ------ | ---- | ---- | ----------- |
1608| cpx  | number | 是    | 0    | 贝塞尔参数的x坐标值,单位:vp。 |
1609| cpy  | number | 是    | 0    | 贝塞尔参数的y坐标值,单位:vp。 |
1610| x    | number | 是    | 0    | 路径结束时的x坐标值,单位:vp。 |
1611| y    | number | 是    | 0    | 路径结束时的y坐标值,单位:vp。 |
1612
1613 **示例:**
1614
1615  ```ts
1616  // xxx.ets
1617  @Entry
1618  @Component
1619  struct QuadraticCurveTo {
1620    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1621    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1622    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1623
1624    build() {
1625      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1626        Canvas(this.context)
1627          .width('100%')
1628          .height('100%')
1629          .backgroundColor('#ffff00')
1630          .onReady(() =>{
1631            let offContext = this.offCanvas.getContext("2d", this.settings)
1632            offContext.beginPath()
1633            offContext.moveTo(20, 20)
1634            offContext.quadraticCurveTo(100, 100, 200, 20)
1635            offContext.stroke()
1636            let image = this.offCanvas.transferToImageBitmap()
1637            this.context.transferFromImageBitmap(image)
1638        })
1639      }
1640      .width('100%')
1641      .height('100%')
1642    }
1643  }
1644  ```
1645
1646  ![zh-cn_image_0000001194032482](figures/zh-cn_image_0000001194032482.png)
1647
1648
1649### arc
1650
1651arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void
1652
1653绘制弧线路径。
1654
1655从API version 9开始,该接口支持在ArkTS卡片中使用。
1656
1657 **参数:**
1658
1659| 参数               | 类型      | 必填   | 默认值   | 描述         |
1660| ---------------- | ------- | ---- | ----- | ---------- |
1661| x                | number  | 是    | 0     | 弧线圆心的x坐标值,单位:vp。 |
1662| y                | number  | 是    | 0     | 弧线圆心的y坐标值,单位:vp。 |
1663| radius           | number  | 是    | 0     | 弧线的圆半径,单位:vp。    |
1664| startAngle       | number  | 是    | 0     | 弧线的起始弧度。   |
1665| endAngle         | number  | 是    | 0     | 弧线的终止弧度。   |
1666| counterclockwise | boolean | 否    | false | 是否逆时针绘制圆弧。 |
1667
1668 **示例:**
1669
1670  ```ts
1671  // xxx.ets
1672  @Entry
1673  @Component
1674  struct Arc {
1675    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1676    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1677    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1678
1679    build() {
1680      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1681        Canvas(this.context)
1682          .width('100%')
1683          .height('100%')
1684          .backgroundColor('#ffff00')
1685          .onReady(() =>{
1686            let offContext = this.offCanvas.getContext("2d", this.settings)
1687            offContext.beginPath()
1688            offContext.arc(100, 75, 50, 0, 6.28)
1689            offContext.stroke()
1690            let image = this.offCanvas.transferToImageBitmap()
1691            this.context.transferFromImageBitmap(image)
1692          })
1693      }
1694      .width('100%')
1695      .height('100%')
1696    }
1697  }
1698  ```
1699
1700  ![zh-cn_image_0000001239032429](figures/zh-cn_image_0000001239032429.jpeg)
1701
1702
1703### arcTo
1704
1705arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void
1706
1707依据圆弧经过的点和圆弧半径创建圆弧路径。
1708
1709从API version 9开始,该接口支持在ArkTS卡片中使用。
1710
1711 **参数:**
1712
1713| 参数     | 类型     | 必填   | 默认值  | 描述              |
1714| ------ | ------ | ---- | ---- | --------------- |
1715| x1     | number | 是    | 0    | 圆弧经过的第一个点的x坐标值,单位:vp。 |
1716| y1     | number | 是    | 0    | 圆弧经过的第一个点的y坐标值,单位:vp。 |
1717| x2     | number | 是    | 0    | 圆弧经过的第二个点的x坐标值,单位:vp。 |
1718| y2     | number | 是    | 0    | 圆弧经过的第二个点的y坐标值,单位:vp。 |
1719| radius | number | 是    | 0    | 圆弧的圆半径值,单位:vp。        |
1720
1721 **示例:**
1722
1723  ```ts
1724  // xxx.ets
1725  @Entry
1726  @Component
1727  struct ArcTo {
1728    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1729    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1730    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1731
1732    build() {
1733      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1734        Canvas(this.context)
1735          .width('100%')
1736          .height('100%')
1737          .backgroundColor('#ffff00')
1738          .onReady(() =>{
1739            let offContext = this.offCanvas.getContext("2d", this.settings)
1740            offContext.moveTo(100, 20)
1741            offContext.arcTo(150, 20, 150, 70, 50)
1742            offContext.stroke()
1743            let image = this.offCanvas.transferToImageBitmap()
1744            this.context.transferFromImageBitmap(image)
1745          })
1746      }
1747      .width('100%')
1748      .height('100%')
1749    }
1750  }
1751  ```
1752
1753  ![zh-cn_image_0000001193872524](figures/zh-cn_image_0000001193872524.png)
1754
1755
1756### ellipse
1757
1758ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void
1759
1760在规定的矩形区域绘制一个椭圆。
1761
1762从API version 9开始,该接口支持在ArkTS卡片中使用。
1763
1764 **参数:**
1765
1766| 参数               | 类型      | 必填   | 默认值   | 说明                                       |
1767| ---------------- | ------- | ---- | ----- | ---------------------------------------- |
1768| x                | number  | 是    | 0     | 椭圆圆心的x轴坐标,单位:vp。                               |
1769| y                | number  | 是    | 0     | 椭圆圆心的y轴坐标,单位:vp。                               |
1770| radiusX          | number  | 是    | 0     | 椭圆x轴的半径长度,单位:vp。                               |
1771| radiusY          | number  | 是    | 0     | 椭圆y轴的半径长度,单位:vp。                               |
1772| rotation         | number  | 是    | 0     | 椭圆的旋转角度,单位为弧度。                           |
1773| startAngle       | number  | 是    | 0     | 椭圆绘制的起始点角度,以弧度表示。                        |
1774| endAngle         | number  | 是    | 0     | 椭圆绘制的结束点角度,以弧度表示。                        |
1775| counterclockwise | boolean | 否    | false | 是否以逆时针方向绘制椭圆。<br>true:逆时针方向绘制椭圆。<br>false:顺时针方向绘制椭圆。 |
1776
1777 **示例:**
1778
1779  ```ts
1780  // xxx.ets
1781  @Entry
1782  @Component
1783  struct CanvasExample {
1784    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1785    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1786    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1787    build() {
1788      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1789        Canvas(this.context)
1790          .width('100%')
1791          .height('100%')
1792          .backgroundColor('#ffff00')
1793          .onReady(() =>{
1794            let offContext = this.offCanvas.getContext("2d", this.settings)
1795            offContext.beginPath()
1796            offContext.ellipse(200, 200, 50, 100, Math.PI * 0.25, Math.PI * 0.5, Math.PI * 2, false)
1797            offContext.stroke()
1798            offContext.beginPath()
1799            offContext.ellipse(200, 300, 50, 100, Math.PI * 0.25, Math.PI * 0.5, Math.PI * 2, true)
1800            offContext.stroke()
1801            let image = this.offCanvas.transferToImageBitmap()
1802            this.context.transferFromImageBitmap(image)
1803          })
1804      }
1805      .width('100%')
1806      .height('100%')
1807    }
1808  }
1809  ```
1810
1811  ![zh-cn_image_0000001194192440](figures/zh-cn_image_0000001194192440.jpeg)
1812
1813
1814### rect
1815
1816rect(x: number, y: number, w: number, h: number): void
1817
1818创建矩形路径。
1819
1820从API version 9开始,该接口支持在ArkTS卡片中使用。
1821
1822 **参数:**
1823
1824| 参数   | 类型     | 必填   | 默认值  | 描述            |
1825| ---- | ------ | ---- | ---- | ------------- |
1826| x    | number | 是    | 0    | 指定矩形的左上角x坐标值,单位:vp。 |
1827| y    | number | 是    | 0    | 指定矩形的左上角y坐标值,单位:vp。 |
1828| w    | number | 是    | 0    | 指定矩形的宽度,单位:vp。      |
1829| h    | number | 是    | 0    | 指定矩形的高度,单位:vp。      |
1830
1831 **示例:**
1832
1833  ```ts
1834  // xxx.ets
1835  @Entry
1836  @Component
1837  struct CanvasExample {
1838    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1839    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1840    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1841
1842    build() {
1843      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1844        Canvas(this.context)
1845          .width('100%')
1846          .height('100%')
1847          .backgroundColor('#ffff00')
1848          .onReady(() =>{
1849            let offContext = this.offCanvas.getContext("2d", this.settings)
1850            offContext.rect(20, 20, 100, 100) // Create a 100*100 rectangle at (20, 20)
1851            offContext.stroke()
1852            let image = this.offCanvas.transferToImageBitmap()
1853            this.context.transferFromImageBitmap(image)
1854          })
1855      }
1856      .width('100%')
1857      .height('100%')
1858    }
1859  }
1860  ```
1861
1862  ![zh-cn_image_0000001238712445](figures/zh-cn_image_0000001238712445.jpeg)
1863
1864
1865### fill
1866
1867fill(fillRule?: CanvasFillRule): void
1868
1869对封闭路径进行填充。
1870
1871从API version 9开始,该接口支持在ArkTS卡片中使用。
1872
1873**参数:**
1874
1875| 参数       | 类型             | 必填   | 默认值       | 描述                                       |
1876| -------- | -------------- | ---- | --------- | ---------------------------------------- |
1877| fillRule | [CanvasFillRule](ts-canvasrenderingcontext2d.md#canvasfillrule) | 否    | "nonzero" | 指定要填充对象的规则。<br/>可选参数为:"nonzero", "evenodd"。 |
1878
1879  ```ts
1880  // xxx.ets
1881  @Entry
1882  @Component
1883  struct Fill {
1884    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1885    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1886    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1887
1888    build() {
1889      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1890        Canvas(this.context)
1891          .width('100%')
1892          .height('100%')
1893          .backgroundColor('#ffff00')
1894          .onReady(() =>{
1895            let offContext = this.offCanvas.getContext("2d", this.settings)
1896            offContext.fillStyle = '#000000'
1897            offContext.rect(20, 20, 100, 100) // Create a 100*100 rectangle at (20, 20)
1898            offContext.fill()
1899            let image = this.offCanvas.transferToImageBitmap()
1900            this.context.transferFromImageBitmap(image)
1901          })
1902      }
1903      .width('100%')
1904      .height('100%')
1905    }
1906  }
1907  ```
1908
1909  ![zh-cn_image_0000001194192462](figures/zh-cn_image_0000001194192462.png)
1910
1911
1912fill(path: Path2D, fillRule?: CanvasFillRule): void
1913
1914对封闭路径进行填充。
1915
1916从API version 9开始,该接口支持在ArkTS卡片中使用。
1917
1918**参数:**
1919
1920| 参数       | 类型             | 必填   | 默认值       | 描述                                       |
1921| -------- | -------------- | ---- | --------- | ---------------------------------------- |
1922| path     | [Path2D](ts-components-canvas-path2d.md)         | 是    |           | Path2D填充路径。                              |
1923| fillRule | [CanvasFillRule](ts-canvasrenderingcontext2d.md#canvasfillrule) | 否    | "nonzero" | 指定要填充对象的规则。<br/>可选参数为:"nonzero", "evenodd"。 |
1924
1925**示例:**
1926
1927```ts
1928// xxx.ets
1929@Entry
1930@Component
1931struct Fill {
1932  private settings: RenderingContextSettings = new RenderingContextSettings(true)
1933  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1934  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1935
1936  build() {
1937    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1938      Canvas(this.context)
1939        .width('100%')
1940        .height('100%')
1941        .backgroundColor('#ffff00')
1942        .onReady(() =>{
1943          let offContext = this.offCanvas.getContext("2d", this.settings)
1944          let region = new Path2D()
1945          region.moveTo(30, 90)
1946          region.lineTo(110, 20)
1947          region.lineTo(240, 130)
1948          region.lineTo(60, 130)
1949          region.lineTo(190, 20)
1950          region.lineTo(270, 90)
1951          region.closePath()
1952          // Fill path
1953          offContext.fillStyle = '#00ff00'
1954          offContext.fill(region, "evenodd")
1955          let image = this.offCanvas.transferToImageBitmap()
1956          this.context.transferFromImageBitmap(image)
1957        })
1958    }
1959    .width('100%')
1960    .height('100%')
1961  }
1962}
1963```
1964
1965 ![zh-cn_image_000000127777775](figures/zh-cn_image_000000127777775.png)
1966
1967
1968
1969### clip
1970
1971clip(fillRule?: CanvasFillRule): void
1972
1973设置当前路径为剪切路径。
1974
1975从API version 9开始,该接口支持在ArkTS卡片中使用。
1976
1977**参数:**
1978
1979| 参数       | 类型             | 必填   | 默认值       | 描述                                       |
1980| -------- | -------------- | ---- | --------- | ---------------------------------------- |
1981| fillRule | [CanvasFillRule](ts-canvasrenderingcontext2d.md#canvasfillrule) | 否    | "nonzero" | 指定要剪切对象的规则。<br/>可选参数为:"nonzero", "evenodd"。 |
1982
1983 **示例:**
1984
1985  ```ts
1986  // xxx.ets
1987  @Entry
1988  @Component
1989  struct Clip {
1990    private settings: RenderingContextSettings = new RenderingContextSettings(true)
1991    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
1992    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
1993
1994    build() {
1995      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
1996        Canvas(this.context)
1997          .width('100%')
1998          .height('100%')
1999          .backgroundColor('#ffff00')
2000          .onReady(() =>{
2001            let offContext = this.offCanvas.getContext("2d", this.settings)
2002            offContext.rect(0, 0, 100, 200)
2003            offContext.stroke()
2004            offContext.clip()
2005            offContext.fillStyle = "rgb(255,0,0)"
2006            offContext.fillRect(0, 0, 200, 200)
2007            let image = this.offCanvas.transferToImageBitmap()
2008            this.context.transferFromImageBitmap(image)
2009          })
2010      }
2011      .width('100%')
2012      .height('100%')
2013    }
2014  }
2015  ```
2016
2017  ![zh-cn_image_0000001194032462](figures/zh-cn_image_0000001194032462.png)
2018
2019
2020clip(path:Path2D, fillRule?: CanvasFillRule): void
2021
2022设置封闭路径为剪切路径。
2023
2024从API version 9开始,该接口支持在ArkTS卡片中使用。
2025
2026**参数:**
2027
2028| 参数       | 类型             | 必填   | 默认值       | 描述                                       |
2029| -------- | -------------- | ---- | --------- | ---------------------------------------- |
2030| path     | [Path2D](ts-components-canvas-path2d.md)         | 是    |           | Path2D剪切路径。                              |
2031| fillRule | [CanvasFillRule](ts-canvasrenderingcontext2d.md#canvasfillrule) | 否    | "nonzero" | 指定要剪切对象的规则。<br/>可选参数为:"nonzero", "evenodd"。 |
2032
2033 **示例:**
2034
2035  ```ts
2036  // xxx.ets
2037  @Entry
2038  @Component
2039  struct Clip {
2040    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2041    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2042    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2043
2044    build() {
2045      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2046        Canvas(this.context)
2047          .width('100%')
2048          .height('100%')
2049          .backgroundColor('#ffff00')
2050          .onReady(() =>{
2051            let offContext = this.offCanvas.getContext("2d", this.settings)
2052            let region = new Path2D()
2053            region.moveTo(30, 90)
2054            region.lineTo(110, 20)
2055            region.lineTo(240, 130)
2056            region.lineTo(60, 130)
2057            region.lineTo(190, 20)
2058            region.lineTo(270, 90)
2059            region.closePath()
2060            offContext.clip(region,"evenodd")
2061            offContext.fillStyle = "rgb(0,255,0)"
2062            offContext.fillRect(0, 0, 600, 600)
2063            let image = this.offCanvas.transferToImageBitmap()
2064            this.context.transferFromImageBitmap(image)
2065          })
2066      }
2067      .width('100%')
2068      .height('100%')
2069    }
2070  }
2071  ```
2072
2073  ![zh-cn_image_000000127777779](figures/zh-cn_image_000000127777779.png)
2074
2075### resetTransform
2076
2077resetTransform(): void
2078
2079使用单位矩阵重新设置当前矩阵。该接口为空接口。
2080
2081从API version 9开始,该接口支持在ArkTS卡片中使用。
2082
2083### rotate
2084
2085rotate(angle: number): void
2086
2087针对当前坐标轴进行顺时针旋转。
2088
2089从API version 9开始,该接口支持在ArkTS卡片中使用。
2090
2091 **参数:**
2092
2093| 参数    | 类型     | 必填   | 默认值  | 描述                                       |
2094| ----- | ------ | ---- | ---- | ---------------------------------------- |
2095| angle | number | 是    | 0    | 设置顺时针旋转的弧度值,可以通过Math.PI&nbsp;/&nbsp;180将角度转换为弧度值。 |
2096
2097 **示例:**
2098
2099  ```ts
2100  // xxx.ets
2101  @Entry
2102  @Component
2103  struct Rotate {
2104    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2105    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2106    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2107
2108    build() {
2109      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2110        Canvas(this.context)
2111          .width('100%')
2112          .height('100%')
2113          .backgroundColor('#ffff00')
2114          .onReady(() =>{
2115            let offContext = this.offCanvas.getContext("2d", this.settings)
2116            offContext.rotate(45 * Math.PI / 180)
2117            offContext.fillRect(70, 20, 50, 50)
2118            let image = this.offCanvas.transferToImageBitmap()
2119            this.context.transferFromImageBitmap(image)
2120          })
2121      }
2122      .width('100%')
2123      .height('100%')
2124    }
2125  }
2126  ```
2127
2128  ![zh-cn_image_0000001238952405](figures/zh-cn_image_0000001238952405.png)
2129
2130
2131### scale
2132
2133scale(x: number, y: number): void
2134
2135设置canvas画布的缩放变换属性,后续的绘制操作将按照缩放比例进行缩放。
2136
2137从API version 9开始,该接口支持在ArkTS卡片中使用。
2138
2139 **参数:**
2140
2141| 参数   | 类型     | 必填   | 默认值  | 描述          |
2142| ---- | ------ | ---- | ---- | ----------- |
2143| x    | number | 是    | 0    | 设置水平方向的缩放值。 |
2144| y    | number | 是    | 0    | 设置垂直方向的缩放值。 |
2145
2146 **示例:**
2147
2148  ```ts
2149  // xxx.ets
2150  @Entry
2151  @Component
2152  struct Scale {
2153    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2154    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2155    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2156
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 offContext = this.offCanvas.getContext("2d", this.settings)
2165            offContext.lineWidth = 3
2166            offContext.strokeRect(30, 30, 50, 50)
2167            offContext.scale(2, 2) // Scale to 200%
2168            offContext.strokeRect(30, 30, 50, 50)
2169            let image = this.offCanvas.transferToImageBitmap()
2170            this.context.transferFromImageBitmap(image)
2171          })
2172      }
2173      .width('100%')
2174      .height('100%')
2175    }
2176  }
2177  ```
2178
2179  ![zh-cn_image_0000001193872498](figures/zh-cn_image_0000001193872498.png)
2180
2181
2182### transform
2183
2184transform(a: number, b: number, c: number, d: number, e: number, f: number): void
2185
2186transform方法对应一个变换矩阵,想对一个图形进行变化的时候,只要设置此变换矩阵相应的参数,对图形的各个定点的坐标分别乘以这个矩阵,就能得到新的定点的坐标。矩阵变换效果可叠加。
2187
2188从API version 9开始,该接口支持在ArkTS卡片中使用。
2189
2190> **说明:**
2191> 变换后的坐标计算方式(x和y为变换前坐标,x'和y'为变换后坐标):
2192>
2193> - x' = scaleX \* x + skewY \* y + translateX
2194>
2195> - y' = skewX \* x + scaleY \* y + translateY
2196
2197**参数:**
2198
2199| 参数   | 类型     | 必填   | 默认值  | 描述                   |
2200| ---- | ------ | ---- | ---- | -------------------- |
2201| a    | number | 是    | 0    | scaleX: 指定水平缩放值。     |
2202| b    | number | 是    | 0    | skewX: 指定垂直倾斜值。      |
2203| c    | number | 是    | 0    | skewY: 指定水平倾斜值。      |
2204| d    | number | 是    | 0    | scaleY: 指定垂直缩放值。     |
2205| e    | number | 是    | 0    | translateX: 指定水平移动值,单位:vp。 |
2206| f    | number | 是    | 0    | translateY: 指定垂直移动值,单位:vp。 |
2207
2208 **示例:**
2209
2210  ```ts
2211  // xxx.ets
2212  @Entry
2213  @Component
2214  struct Transform {
2215    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2216    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2217    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2218
2219    build() {
2220      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2221        Canvas(this.context)
2222          .width('100%')
2223          .height('100%')
2224          .backgroundColor('#ffff00')
2225          .onReady(() =>{
2226            let offContext = this.offCanvas.getContext("2d", this.settings)
2227            offContext.fillStyle = 'rgb(0,0,0)'
2228            offContext.fillRect(0, 0, 100, 100)
2229            offContext.transform(1, 0.5, -0.5, 1, 10, 10)
2230            offContext.fillStyle = 'rgb(255,0,0)'
2231            offContext.fillRect(0, 0, 100, 100)
2232            offContext.transform(1, 0.5, -0.5, 1, 10, 10)
2233            offContext.fillStyle = 'rgb(0,0,255)'
2234            offContext.fillRect(0, 0, 100, 100)
2235            let image = this.offCanvas.transferToImageBitmap()
2236            this.context.transferFromImageBitmap(image)
2237          })
2238      }
2239      .width('100%')
2240      .height('100%')
2241    }
2242  }
2243  ```
2244
2245  ![zh-cn_image_0000001239032431](figures/zh-cn_image_0000001239032431.png)
2246
2247
2248### setTransform
2249
2250setTransform(a: number, b: number, c: number, d: number, e: number, f: number): void
2251
2252setTransform方法使用的参数和transform()方法相同,但setTransform()方法会重置现有的变换矩阵并创建新的变换矩阵。
2253
2254从API version 9开始,该接口支持在ArkTS卡片中使用。
2255
2256**参数:**
2257
2258| 参数   | 类型     | 必填   | 默认值  | 描述                   |
2259| ---- | ------ | ---- | ---- | -------------------- |
2260| a    | number | 是    | 0    | scaleX: 指定水平缩放值。     |
2261| b    | number | 是    | 0    | skewX: 指定垂直倾斜值。      |
2262| c    | number | 是    | 0    | skewY: 指定水平倾斜值。      |
2263| d    | number | 是    | 0    | scaleY: 指定垂直缩放值。     |
2264| e    | number | 是    | 0    | translateX: 指定水平移动值,单位:vp。 |
2265| f    | number | 是    | 0    | translateY: 指定垂直移动值,单位:vp。 |
2266
2267 **示例:**
2268
2269  ```ts
2270  // xxx.ets
2271  @Entry
2272  @Component
2273  struct SetTransform {
2274    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2275    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2276    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2277
2278    build() {
2279      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2280        Canvas(this.context)
2281          .width('100%')
2282          .height('100%')
2283          .backgroundColor('#ffff00')
2284          .onReady(() =>{
2285            let offContext = this.offCanvas.getContext("2d", this.settings)
2286            offContext.fillStyle = 'rgb(255,0,0)'
2287            offContext.fillRect(0, 0, 100, 100)
2288            offContext.setTransform(1,0.5, -0.5, 1, 10, 10)
2289            offContext.fillStyle = 'rgb(0,0,255)'
2290            offContext.fillRect(0, 0, 100, 100)
2291            let image = this.offCanvas.transferToImageBitmap()
2292            this.context.transferFromImageBitmap(image)
2293          })
2294      }
2295      .width('100%')
2296      .height('100%')
2297    }
2298  }
2299  ```
2300
2301  ![zh-cn_image_0000001193872526](figures/zh-cn_image_0000001193872526.png)
2302
2303
2304### setTransform
2305
2306setTransform(transform?: Matrix2D): void
2307
2308以Matrix2D对象为模板重置现有的变换矩阵并创建新的变换矩阵。
2309
2310从API version 9开始,该接口支持在ArkTS卡片中使用。
2311
2312**参数:**
2313
2314| 参数        | 类型                                       | 必填   | 默认值  | 描述    |
2315| --------- | ---------------------------------------- | ---- | ---- | ----- |
2316| transform | [Matrix2D](ts-components-canvas-matrix2d.md#Matrix2D) | 否    | null | 变换矩阵。 |
2317
2318**示例:**
2319 ```ts
2320 // xxx.ets
2321  @Entry
2322  @Component
2323  struct TransFormDemo {
2324    private settings: RenderingContextSettings = new RenderingContextSettings(true);
2325    private context1: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
2326    private offcontext1: OffscreenCanvasRenderingContext2D = new OffscreenCanvasRenderingContext2D(600, 200, this.settings);
2327    private context2: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
2328    private offcontext2: OffscreenCanvasRenderingContext2D = new OffscreenCanvasRenderingContext2D(600, 200, this.settings);
2329
2330    build() {
2331      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2332        Text('context1');
2333        Canvas(this.context1)
2334          .width('230vp')
2335          .height('160vp')
2336          .backgroundColor('#ffff00')
2337          .onReady(() =>{
2338            this.offcontext1.fillRect(100, 20, 50, 50);
2339            this.offcontext1.setTransform(1, 0.5, -0.5, 1, 10, 10);
2340            this.offcontext1.fillRect(100, 20, 50, 50);
2341            let image = this.offcontext1.transferToImageBitmap();
2342            this.context1.transferFromImageBitmap(image);
2343          })
2344        Text('context2');
2345        Canvas(this.context2)
2346          .width('230vp')
2347          .height('160vp')
2348          .backgroundColor('#0ffff0')
2349          .onReady(() =>{
2350            this.offcontext2.fillRect(100, 20, 50, 50);
2351            let storedTransform = this.offcontext1.getTransform();
2352            this.offcontext2.setTransform(storedTransform);
2353            this.offcontext2.fillRect(100, 20, 50, 50);
2354            let image = this.offcontext2.transferToImageBitmap();
2355            this.context2.transferFromImageBitmap(image);
2356          })
2357      }
2358      .width('100%')
2359      .height('100%')
2360    }
2361  }
2362 ```
2363 ![zh-cn_image_0000001193872527.jpeg](figures/zh-cn_image_0000001193872527.jpeg)
2364
2365### getTransform
2366
2367getTransform(): Matrix2D
2368
2369获取当前被应用到上下文的转换矩阵。
2370
2371从API version 9开始,该接口支持在ArkTS卡片中使用。
2372
2373**返回值:**
2374
2375| 类型                                       | 说明    |
2376| ---------------------------------------- | ----- |
2377| [Matrix2D](ts-components-canvas-matrix2d.md#Matrix2D) | 矩阵对象。 |
2378
2379**示例:**
2380
2381  ```ts
2382  // xxx.ets
2383  @Entry
2384  @Component
2385  struct TransFormDemo {
2386    private settings: RenderingContextSettings = new RenderingContextSettings(true);
2387    private context1: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
2388    private offcontext1: OffscreenCanvasRenderingContext2D = new OffscreenCanvasRenderingContext2D(600, 100, this.settings);
2389    private context2: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
2390    private offcontext2: OffscreenCanvasRenderingContext2D = new OffscreenCanvasRenderingContext2D(600, 100, this.settings);
2391
2392    build() {
2393      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2394        Text('context1');
2395        Canvas(this.context1)
2396          .width('230vp')
2397          .height('120vp')
2398          .backgroundColor('#ffff00')
2399          .onReady(() =>{
2400            this.offcontext1.fillRect(50, 50, 50, 50);
2401            this.offcontext1.setTransform(1.2, Math.PI/8, Math.PI/6, 0.5, 30, -25);
2402            this.offcontext1.fillRect(50, 50, 50, 50);
2403            let image = this.offcontext1.transferToImageBitmap();
2404            this.context1.transferFromImageBitmap(image);
2405          })
2406        Text('context2');
2407        Canvas(this.context2)
2408          .width('230vp')
2409          .height('120vp')
2410          .backgroundColor('#0ffff0')
2411          .onReady(() =>{
2412            this.offcontext2.fillRect(50, 50, 50, 50);
2413            let storedTransform = this.offcontext1.getTransform();
2414            console.log("Matrix [scaleX = " + storedTransform.scaleX + ", scaleY = " + storedTransform.scaleY +
2415            ", rotateX = " + storedTransform.rotateX + ", rotateY = " + storedTransform.rotateY +
2416            ", translateX = " + storedTransform.translateX + ", translateY = " + storedTransform.translateY + "]")
2417            this.offcontext2.setTransform(storedTransform);
2418            this.offcontext2.fillRect(50,50,50,50);
2419            let image = this.offcontext2.transferToImageBitmap();
2420            this.context2.transferFromImageBitmap(image);
2421          })
2422      }
2423      .width('100%')
2424      .height('100%')
2425    }
2426  }
2427  ```
2428
2429  ![zh-cn_image_0000001219982726.png](figures/zh-cn_image_0000001219982726.png)
2430
2431### translate
2432
2433translate(x: number, y: number): void
2434
2435移动当前坐标系的原点。
2436
2437从API version 9开始,该接口支持在ArkTS卡片中使用。
2438
2439 **参数:**
2440
2441| 参数   | 类型     | 必填   | 默认值  | 描述       |
2442| ---- | ------ | ---- | ---- | -------- |
2443| x    | number | 是    | 0    | 设置水平平移量,单位:vp。 |
2444| y    | number | 是    | 0    | 设置竖直平移量,单位:vp。 |
2445
2446 **示例:**
2447
2448  ```ts
2449  // xxx.ets
2450  @Entry
2451  @Component
2452  struct Translate {
2453    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2454    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2455    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2456
2457    build() {
2458      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2459        Canvas(this.context)
2460          .width('100%')
2461          .height('100%')
2462          .backgroundColor('#ffff00')
2463          .onReady(() =>{
2464            let offContext = this.offCanvas.getContext("2d", this.settings)
2465            offContext.fillRect(10, 10, 50, 50)
2466            offContext.translate(70, 70)
2467            offContext.fillRect(10, 10, 50, 50)
2468            let image = this.offCanvas.transferToImageBitmap()
2469            this.context.transferFromImageBitmap(image)
2470          })
2471      }
2472      .width('100%')
2473      .height('100%')
2474    }
2475  }
2476  ```
2477
2478  ![zh-cn_image_0000001238832413](figures/zh-cn_image_0000001238832413.png)
2479
2480
2481### drawImage
2482
2483drawImage(image: ImageBitmap | PixelMap, dx: number, dy: number): void
2484
2485drawImage(image: ImageBitmap | PixelMap, dx: number, dy: number, dw: number, dh: number): void
2486
2487drawImage(image: ImageBitmap | PixelMap, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number):void
2488
2489进行图像绘制。
2490
2491从API version 9开始,该接口支持在ArkTS卡片中使用,卡片中不支持PixelMap对象。
2492
2493 **参数:**
2494
2495| 参数    | 类型                                       | 必填   | 默认值  | 描述                            |
2496| ----- | ---------------------------------------- | ---- | ---- | ----------------------------- |
2497| image | [ImageBitmap](ts-components-canvas-imagebitmap.md) 或[PixelMap](../apis/js-apis-image.md#pixelmap7) | 是    | null | 图片资源,请参考ImageBitmap或PixelMap。 |
2498| sx    | number                                   | 否    | 0    | 裁切源图像时距离源图像左上角的x坐标值,单位:vp。          |
2499| sy    | number                                   | 否    | 0    | 裁切源图像时距离源图像左上角的y坐标值,单位:vp。          |
2500| sw    | number                                   | 否    | 0    | 裁切源图像时需要裁切的宽度,单位:vp。                |
2501| sh    | number                                   | 否    | 0    | 裁切源图像时需要裁切的高度,单位:vp。                |
2502| dx    | number                                   | 是    | 0    | 绘制区域左上角在x轴的位置,单位:vp。                |
2503| dy    | number                                   | 是    | 0    | 绘制区域左上角在y&nbsp;轴的位置,单位:vp。          |
2504| dw    | number                                   | 否    | 0    | 绘制区域的宽度,单位:vp。                      |
2505| dh    | number                                   | 否    | 0    | 绘制区域的高度,单位:vp。                      |
2506
2507
2508 **示例:**
2509
2510  ```ts
2511  // xxx.ets
2512  @Entry
2513  @Component
2514  struct DrawImage {
2515    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2516    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2517    private img:ImageBitmap = new ImageBitmap("common/images/icon.jpg")
2518    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2519    build() {
2520      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2521        Canvas(this.context)
2522        .width('100%')
2523        .height('100%')
2524        .backgroundColor('#ffff00')
2525        .onReady(() => {
2526            let offContext = this.offCanvas.getContext("2d", this.settings)
2527            offContext.drawImage( this.img,0,0,400,200)
2528            let image = this.offCanvas.transferToImageBitmap()
2529            this.context.transferFromImageBitmap(image)
2530        })
2531      }
2532      .width('100%')
2533      .height('100%')
2534    }
2535  }
2536  ```
2537
2538  ![zh-cn_image_0000001238712447](figures/zh-cn_image_0000001238712447.png)
2539
2540
2541### createImageData
2542
2543createImageData(sw: number, sh: number): ImageData
2544
2545根据当前ImageData对象重新创建一个宽、高相同的ImageData对象,请参考[ImageData](ts-components-canvas-imagedata.md)。createImageData示例同putImageData。
2546
2547从API version 9开始,该接口支持在ArkTS卡片中使用。
2548
2549 **参数:**
2550
2551| 参数   | 类型     | 必填   | 默认   | 描述            |
2552| ---- | ------ | ---- | ---- | ------------- |
2553| sw   | number | 是    | 0    | ImageData的宽度,单位:vp。 |
2554| sh   | number | 是    | 0    | ImageData的高度,单位:vp。 |
2555
2556
2557createImageData(imageData: ImageData): ImageData
2558
2559根据已创建的ImageData对象创建新的ImageData对象,请参考[ImageData](ts-components-canvas-imagedata.md)。createImageData示例同putImageData。
2560
2561从API version 9开始,该接口支持在ArkTS卡片中使用。
2562
2563 **参数:**
2564
2565| 参数        | 类型                                       | 必填   | 默认   | 描述               |
2566| --------- | ---------------------------------------- | ---- | ---- | ---------------- |
2567| imagedata | [ImageData](ts-components-canvas-imagedata.md) | 是    | null | 被复制的ImageData对象。 |
2568
2569 **返回值:**
2570
2571| 类型                                       | 说明            |
2572| ---------------------------------------- | ------------- |
2573| [ImageData](ts-components-canvas-imagedata.md) | 新的ImageData对象 |
2574
2575### getPixelMap
2576
2577getPixelMap(sx: number, sy: number, sw: number, sh: number): PixelMap
2578
2579以当前canvas指定区域内的像素创建[PixelMap](../apis/js-apis-image.md#pixelmap7)对象,该接口存在内存拷贝行为,高耗时,应避免频繁使用。
2580
2581 **参数:**
2582
2583| 参数   | 类型     | 必填   | 默认值  | 描述              |
2584| ---- | ------ | ---- | ---- | --------------- |
2585| sx   | number | 是    | 0    | 需要输出的区域的左上角x坐标,单位:vp。 |
2586| sy   | number | 是    | 0    | 需要输出的区域的左上角y坐标,单位:vp。 |
2587| sw   | number | 是    | 0    | 需要输出的区域的宽度,单位:vp。     |
2588| sh   | number | 是    | 0    | 需要输出的区域的高度,单位:vp。     |
2589
2590**返回值:**
2591
2592| 类型                                       | 说明           |
2593| ---------------------------------------- | ------------ |
2594| [PixelMap](../apis/js-apis-image.md#pixelmap7) | 新的PixelMap对象 |
2595
2596**示例:**
2597
2598  ```ts
2599  // xxx.ets
2600  @Entry
2601  @Component
2602  struct GetPixelMap {
2603    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2604    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2605    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2606    private img:ImageBitmap = new ImageBitmap("/images/star.png")
2607
2608    build() {
2609      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2610        Canvas(this.context)
2611          .width('100%')
2612          .height('100%')
2613          .backgroundColor('#ffff00')
2614          .onReady(() =>{
2615             let offContext = this.offCanvas.getContext("2d", this.settings)
2616             offContext.drawImage(this.img, 100, 100, 130, 130)
2617             let pixelmap = offContext.getPixelMap(150, 150, 130, 130)
2618             offContext.setPixelMap(pixelmap)
2619             let image = this.offCanvas.transferToImageBitmap()
2620             this.context.transferFromImageBitmap(image)
2621          })
2622      }
2623      .width('100%')
2624      .height('100%')
2625    }
2626  }
2627  ```
2628
2629  ![zh-cn_image_000000127777783](figures/zh-cn_image_000000127777783.jpeg)
2630
2631### setPixelMap
2632
2633setPixelMap(value?: PixelMap): void
2634
2635将当前传入[PixelMap](../apis/js-apis-image.md#pixelmap7)对象绘制在画布上。setPixelMap示例同getPixelMap。
2636
2637 **参数:**
2638
2639| 参数   | 类型     | 必填   | 默认值  | 描述              |
2640| ---- | ------ | ---- | ---- | --------------- |
2641|  value  | [PixelMap](../apis/js-apis-image.md#pixelmap7) | 否    |  null   | 包含像素值的PixelMap对象 |
2642
2643
2644### getImageData
2645
2646getImageData(sx: number, sy: number, sw: number, sh: number): ImageData
2647
2648以当前canvas指定区域内的像素创建[ImageData](ts-components-canvas-imagedata.md)对象,该接口存在内存拷贝行为,高耗时,应避免频繁使用。
2649
2650从API version 9开始,该接口支持在ArkTS卡片中使用。
2651
2652 **参数:**
2653
2654| 参数   | 类型     | 必填   | 默认值  | 描述              |
2655| ---- | ------ | ---- | ---- | --------------- |
2656| sx   | number | 是    | 0    | 需要输出的区域的左上角x坐标,单位:vp。 |
2657| sy   | number | 是    | 0    | 需要输出的区域的左上角y坐标,单位:vp。 |
2658| sw   | number | 是    | 0    | 需要输出的区域的宽度,单位:vp。     |
2659| sh   | number | 是    | 0    | 需要输出的区域的高度,单位:vp。     |
2660
2661   **返回值:**
2662
2663| 类型                                       | 说明            |
2664| ---------------------------------------- | ------------- |
2665| [ImageData](ts-components-canvas-imagedata.md) | 新的ImageData对象 |
2666
2667
2668**示例:**
2669
2670  ```ts
2671  // xxx.ets
2672  @Entry
2673  @Component
2674  struct GetImageData {
2675    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2676    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2677    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2678    private img:ImageBitmap = new ImageBitmap("/common/images/1234.png")
2679
2680    build() {
2681      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2682        Canvas(this.context)
2683          .width('100%')
2684          .height('100%')
2685          .backgroundColor('#ffff00')
2686          .onReady(() =>{
2687            let offContext = this.offCanvas.getContext("2d", this.settings)
2688            offContext.drawImage(this.img,0,0,130,130)
2689            let imagedata = offContext.getImageData(50,50,130,130)
2690            offContext.putImageData(imagedata,150,150)
2691            let image = this.offCanvas.transferToImageBitmap()
2692            this.context.transferFromImageBitmap(image)
2693          })
2694      }
2695      .width('100%')
2696      .height('100%')
2697    }
2698  }
2699  ```
2700
2701  ![zh-cn_image_000000127777780](figures/zh-cn_image_000000127777780.png)
2702
2703
2704### putImageData
2705
2706putImageData(imageData: Object, dx: number | string, dy: number | string): void
2707
2708putImageData(imageData: Object, dx: number | string, dy: number | string, dirtyX: number | string, dirtyY: number | string, dirtyWidth?: number | string, dirtyHeight: number | string): void
2709
2710使用[ImageData](ts-components-canvas-imagedata.md)数据填充新的矩形区域。
2711
2712从API version 9开始,该接口支持在ArkTS卡片中使用。
2713
2714 **参数:**
2715
2716| 参数          | 类型                                       | 必填   | 默认值          | 描述                            |
2717| ----------- | ---------------------------------------- | ---- | ------------ | ----------------------------- |
2718| imagedata   | Object                                   | 是    | null         | 包含像素值的ImageData对象。            |
2719| dx          | number&nbsp;\|&nbsp;string<sup>10+</sup> | 是    | 0            | 填充区域在x轴方向的偏移量,单位:vp。                |
2720| dy          | number&nbsp;\|&nbsp;string<sup>10+</sup> | 是    | 0            | 填充区域在y轴方向的偏移量,单位:vp。                |
2721| dirtyX      | number&nbsp;\|&nbsp;string<sup>10+</sup> | 否    | 0            | 源图像数据矩形裁切范围左上角距离源图像左上角的x轴偏移量,单位:vp。 |
2722| dirtyY      | number&nbsp;\|&nbsp;string<sup>10+</sup> | 否    | 0            | 源图像数据矩形裁切范围左上角距离源图像左上角的y轴偏移量,单位:vp。 |
2723| dirtyWidth  | number&nbsp;\|&nbsp;string<sup>10+</sup> | 否    | imagedata的宽度 | 源图像数据矩形裁切范围的宽度,单位:vp。               |
2724| dirtyHeight | number&nbsp;\|&nbsp;string<sup>10+</sup> | 否    | imagedata的高度 | 源图像数据矩形裁切范围的高度,单位:vp。               |
2725
2726 **示例:**
2727
2728  ```ts
2729  // xxx.ets
2730  @Entry
2731  @Component
2732  struct PutImageData {
2733    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2734    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2735    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2736    build() {
2737      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2738        Canvas(this.context)
2739          .width('100%')
2740          .height('100%')
2741          .backgroundColor('#ffff00')
2742          .onReady(() =>{
2743            let offContext = this.offCanvas.getContext("2d", this.settings)
2744            let imageDataNum = offContext.createImageData(100, 100)
2745            for (let i = 0; i < imageDataNum.data.length; i += 4) {
2746              imageDataNum.data[i + 0] = 255
2747              imageDataNum.data[i + 1] = 0
2748              imageDataNum.data[i + 2] = 255
2749              imageDataNum.data[i + 3] = 255
2750            }
2751            let imageData = this.context.createImageData(imageDataNum)
2752            offContext.putImageData(imageData, 10, 10)
2753            let image = this.offCanvas.transferToImageBitmap()
2754            this.context.transferFromImageBitmap(image)
2755          })
2756      }
2757      .width('100%')
2758      .height('100%')
2759    }
2760  }
2761  ```
2762
2763  ![zh-cn_image_0000001194192464](figures/zh-cn_image_0000001194192464.png)
2764
2765### setLineDash
2766
2767setLineDash(segments: number[]): void
2768
2769设置画布的虚线样式。
2770
2771从API version 9开始,该接口支持在ArkTS卡片中使用。
2772
2773**参数:**
2774
2775| 参数       | 类型       | 描述                  |
2776| -------- | -------- | ------------------- |
2777| segments | number[] | 描述线段如何交替和线段间距长度的数组,单位:vp。 |
2778
2779**示例:**
2780
2781  ```ts
2782  @Entry
2783  @Component
2784  struct SetLineDash {
2785    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2786    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2787    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2788
2789    build() {
2790      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2791        Canvas(this.context)
2792          .width('100%')
2793          .height('100%')
2794          .backgroundColor('#ffff00')
2795          .onReady(() =>{
2796            let offContext = this.offCanvas.getContext("2d", this.settings)
2797            offContext.arc(100, 75, 50, 0, 6.28)
2798            offContext.setLineDash([10,20])
2799            offContext.stroke()
2800            let image = this.offCanvas.transferToImageBitmap()
2801            this.context.transferFromImageBitmap(image)
2802        })
2803      }
2804      .width('100%')
2805      .height('100%')
2806    }
2807  }
2808  ```
2809  ![zh-cn_image_000000127777772](figures/zh-cn_image_000000127777772.png)
2810
2811
2812### getLineDash
2813
2814getLineDash(): number[]
2815
2816获得当前画布的虚线样式。
2817
2818从API version 9开始,该接口支持在ArkTS卡片中使用。
2819
2820**返回值:**
2821
2822| 类型       | 说明                       |
2823| -------- | ------------------------ |
2824| number[] | 返回数组,该数组用来描述线段如何交替和间距长度,单位:vp。 |
2825
2826**示例:**
2827
2828  ```ts
2829  // xxx.ets
2830  @Entry
2831  @Component
2832  struct OffscreenCanvasGetLineDash {
2833    @State message: string = 'Hello World'
2834    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2835    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2836    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2837    build() {
2838      Row() {
2839        Column() {
2840          Text(this.message)
2841            .fontSize(50)
2842            .fontWeight(FontWeight.Bold)
2843            .onClick(()=>{
2844              console.error('before getlinedash clicked')
2845              let offContext = this.offCanvas.getContext("2d", this.settings)
2846              let res = offContext.getLineDash()
2847              console.error(JSON.stringify(res))
2848            })
2849          Canvas(this.context)
2850            .width('100%')
2851            .height('100%')
2852            .backgroundColor('#ffff00')
2853            .onReady(() => {
2854              let offContext = this.offCanvas.getContext("2d", this.settings)
2855              offContext.arc(100, 75, 50, 0, 6.28)
2856              offContext.setLineDash([10,20])
2857              offContext.stroke()
2858              let res = offContext.getLineDash()
2859              let image = this.offCanvas.transferToImageBitmap()
2860              this.context.transferFromImageBitmap(image)
2861            })
2862        }
2863        .width('100%')
2864      }
2865      .height('100%')
2866    }
2867  }
2868  ```
2869![zh-cn_image_000000127777778](figures/zh-cn_image_000000127777778.png)
2870
2871
2872
2873### toDataURL
2874
2875toDataURL(type?: string, quality?: number): string
2876
2877生成一个包含图片展示的URL。
2878
2879从API version 9开始,该接口支持在ArkTS卡片中使用。
2880
2881**参数:**
2882
2883| 参数名     | 参数类型   | 必填   | 描述                                       |
2884| ------- | ------ | ---- | ---------------------------------------- |
2885| type    | string | 否    | 可选参数,用于指定图像格式,默认格式为image/png。            |
2886| quality | number | 否    | 在指定图片格式为image/jpegimage/webp的情况下,可以从0到1的区间内选择图片的质量。如果超出取值范围,将会使用默认值0.92。 |
2887
2888**返回值:**
2889
2890| 类型     | 说明        |
2891| ------ | --------- |
2892| string | 图像的URL地址。 |
2893
2894**示例:**
2895
2896  ```ts
2897  // xxx.ets
2898  @Entry
2899  @Component
2900  struct ToDataURL {
2901      private settings: RenderingContextSettings = new RenderingContextSettings(true)
2902      private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2903      private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2904
2905    build() {
2906      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2907        Canvas(this.context)
2908          .width('100%')
2909          .height('100%')
2910          .backgroundColor('#ffff00')
2911          .onReady(() =>{
2912            let offContext = this.offCanvas.getContext("2d", this.settings)
2913            let dataURL = offContext.toDataURL()
2914          })
2915      }
2916      .width('100%')
2917      .height('100%')
2918    }
2919  }
2920  ```
2921
2922### transferToImageBitmap
2923
2924transferToImageBitmap(): ImageBitmap
2925
2926在离屏画布最近渲染的图像上创建一个ImageBitmap对象。
2927
2928**返回值:**
2929
2930| 类型                                       | 说明              |
2931| ---------------------------------------- | --------------- |
2932| [ImageBitmap](ts-components-canvas-imagebitmap.md) | 存储离屏画布上渲染的像素数据。 |
2933
2934
2935 **示例:**
2936
2937  ```ts
2938  // xxx.ets
2939  @Entry
2940  @Component
2941  struct PutImageData {
2942    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2943    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2944    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2945
2946    build() {
2947      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2948        Canvas(this.context)
2949          .width('100%')
2950          .height('100%')
2951          .backgroundColor('#ffff00')
2952          .onReady(() =>{
2953            let offContext = this.offCanvas.getContext("2d", this.settings)
2954            let imageData = offContext.createImageData(100, 100)
2955            for (let i = 0; i < imageData.data.length; i += 4) {
2956              imageData.data[i + 0] = 255
2957              imageData.data[i + 1] = 0
2958              imageData.data[i + 2] = 255
2959              imageData.data[i + 3] = 255
2960            }
2961            offContext.putImageData(imageData, 10, 10)
2962            let image = this.offCanvas.transferToImageBitmap()
2963            this.context.transferFromImageBitmap(image)
2964          })
2965      }
2966      .width('100%')
2967      .height('100%')
2968    }
2969  }
2970  ```
2971![zh-cn_image_0000001238952387](figures/zh-cn_image_0000001238952387.png)
2972
2973### restore
2974
2975restore(): void
2976
2977对保存的绘图上下文进行恢复。
2978
2979从API version 9开始,该接口支持在ArkTS卡片中使用。
2980
2981 **示例:**
2982
2983  ```ts
2984  // xxx.ets
2985  @Entry
2986  @Component
2987  struct CanvasExample {
2988    private settings: RenderingContextSettings = new RenderingContextSettings(true)
2989    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
2990    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
2991
2992    build() {
2993      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
2994        Canvas(this.context)
2995          .width('100%')
2996          .height('100%')
2997          .backgroundColor('#ffff00')
2998          .onReady(() =>{
2999            let offContext = this.offCanvas.getContext("2d", this.settings)
3000            offContext.save() // save the default state
3001            offContext.fillStyle = "#00ff00"
3002            offContext.fillRect(20, 20, 100, 100)
3003            offContext.restore() // restore to the default state
3004            offContext.fillRect(150, 75, 100, 100)
3005            let image = this.offCanvas.transferToImageBitmap()
3006            this.context.transferFromImageBitmap(image)
3007          })
3008      }
3009      .width('100%')
3010      .height('100%')
3011    }
3012  }
3013  ```
3014![zh-cn_image_000000127777781](figures/zh-cn_image_000000127777781.png)
3015
3016
3017### save
3018
3019save(): void
3020
3021对当前的绘图上下文进行保存。
3022
3023从API version 9开始,该接口支持在ArkTS卡片中使用。
3024
3025 **示例:**
3026
3027  ```ts
3028  // xxx.ets
3029  @Entry
3030  @Component
3031  struct CanvasExample {
3032    private settings: RenderingContextSettings = new RenderingContextSettings(true)
3033    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3034    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
3035
3036    build() {
3037      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3038        Canvas(this.context)
3039          .width('100%')
3040          .height('100%')
3041          .backgroundColor('#ffff00')
3042          .onReady(() =>{
3043            let offContext = this.offCanvas.getContext("2d", this.settings)
3044            offContext.save() // save the default state
3045            offContext.fillStyle = "#00ff00"
3046            offContext.fillRect(20, 20, 100, 100)
3047            offContext.restore() // restore to the default state
3048            offContext.fillRect(150, 75, 100, 100)
3049            let image = this.offCanvas.transferToImageBitmap()
3050            this.context.transferFromImageBitmap(image)
3051          })
3052      }
3053      .width('100%')
3054      .height('100%')
3055    }
3056  }
3057  ```
3058![zh-cn_image_000000127777781](figures/zh-cn_image_000000127777781.png)
3059
3060
3061### createLinearGradient
3062
3063createLinearGradient(x0: number, y0: number, x1: number, y1: number): CanvasGradient
3064
3065创建一个线性渐变色。
3066
3067从API version 9开始,该接口支持在ArkTS卡片中使用。
3068
3069 **参数:**
3070
3071| 参数   | 类型     | 必填   | 默认值  | 描述       |
3072| ---- | ------ | ---- | ---- | -------- |
3073| x0   | number | 是    | 0    | 起点的x轴坐标,单位:vp。 |
3074| y0   | number | 是    | 0    | 起点的y轴坐标,单位:vp。 |
3075| x1   | number | 是    | 0    | 终点的x轴坐标,单位:vp。 |
3076| y1   | number | 是    | 0    | 终点的y轴坐标,单位:vp。 |
3077
3078**返回值:**
3079
3080| 类型     | 说明        |
3081| ------ | --------- |
3082| [CanvasGradient](ts-components-canvas-canvasgradient.md) | 新的CanvasGradient对象,用于在offscreenCanvas上创建渐变效果。 |
3083
3084 **示例:**
3085
3086  ```ts
3087  // xxx.ets
3088  @Entry
3089  @Component
3090  struct CreateLinearGradient {
3091    private settings: RenderingContextSettings = new RenderingContextSettings(true)
3092    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3093    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
3094
3095    build() {
3096      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3097        Canvas(this.context)
3098          .width('100%')
3099          .height('100%')
3100          .backgroundColor('#ffff00')
3101          .onReady(() =>{
3102            let offContext = this.offCanvas.getContext("2d", this.settings)
3103            let grad = offContext.createLinearGradient(50,0, 300,100)
3104            grad.addColorStop(0.0, '#ff0000')
3105            grad.addColorStop(0.5, '#ffffff')
3106            grad.addColorStop(1.0, '#00ff00')
3107            offContext.fillStyle = grad
3108            offContext.fillRect(0, 0, 400, 400)
3109            let image = this.offCanvas.transferToImageBitmap()
3110            this.context.transferFromImageBitmap(image)
3111          })
3112      }
3113      .width('100%')
3114      .height('100%')
3115    }
3116  }
3117  ```
3118
3119  ![zh-cn_image_0000001194032516](figures/zh-cn_image_0000001194032516.jpeg)
3120
3121
3122### createRadialGradient
3123
3124createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): CanvasGradient
3125
3126创建一个径向渐变色。
3127
3128从API version 9开始,该接口支持在ArkTS卡片中使用。
3129
3130  **参数:**
3131
3132| 参数   | 类型     | 必填   | 默认值  | 描述                |
3133| ---- | ------ | ---- | ---- | ----------------- |
3134| x0   | number | 是    | 0    | 起始圆的x轴坐标,单位:vp。         |
3135| y0   | number | 是    | 0    | 起始圆的y轴坐标,单位:vp。         |
3136| r0   | number | 是    | 0    | 起始圆的半径。必须是非负且有限的,单位:vp。 |
3137| x1   | number | 是    | 0    | 终点圆的x轴坐标,单位:vp。         |
3138| y1   | number | 是    | 0    | 终点圆的y轴坐标,单位:vp。         |
3139| r1   | number | 是    | 0    | 终点圆的半径。必须为非负且有限的,单位:vp。 |
3140
3141**返回值:**
3142
3143| 类型     | 说明        |
3144| ------ | --------- |
3145| [CanvasGradient](ts-components-canvas-canvasgradient.md) | 新的CanvasGradient对象,用于在offscreenCanvas上创建渐变效果。 |
3146
3147  **示例:**
3148
3149  ```ts
3150  // xxx.ets
3151  @Entry
3152  @Component
3153  struct CreateRadialGradient {
3154    private settings: RenderingContextSettings = new RenderingContextSettings(true)
3155    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3156    private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
3157
3158    build() {
3159      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3160        Canvas(this.context)
3161          .width('100%')
3162          .height('100%')
3163          .backgroundColor('#ffff00')
3164          .onReady(() =>{
3165            let offContext = this.offCanvas.getContext("2d", this.settings)
3166            let grad = offContext.createRadialGradient(200,200,50, 200,200,200)
3167            grad.addColorStop(0.0, '#ff0000')
3168            grad.addColorStop(0.5, '#ffffff')
3169            grad.addColorStop(1.0, '#00ff00')
3170            offContext.fillStyle = grad
3171            offContext.fillRect(0, 0, 440, 440)
3172            let image = this.offCanvas.transferToImageBitmap()
3173            this.context.transferFromImageBitmap(image)
3174          })
3175      }
3176      .width('100%')
3177      .height('100%')
3178    }
3179  }
3180  ```
3181
3182  ![zh-cn_image_0000001238952407](figures/zh-cn_image_0000001238952407.jpeg)
3183
3184### createConicGradient<sup>10+</sup>
3185
3186createConicGradient(startAngle: number, x: number, y: number): CanvasGradient
3187
3188创建一个圆锥渐变色。
3189
3190**参数:**
3191
3192| 参数         | 类型     | 必填   | 默认值  | 描述                                  |
3193| ---------- | ------ | ---- | ---- | ----------------------------------- |
3194| startAngle | number | 是    | 0    | 开始渐变的角度,以弧度为单位。角度测量从中心右侧水平开始,顺时针移动。 |
3195| x          | number | 是    | 0    | 圆锥渐变的中心x轴坐标,单位:vp。                   |
3196| y          | number | 是    | 0    | 圆锥渐变的中心y轴坐标,单位:vp。                   |
3197
3198| 类型       | 说明                       |
3199| -------- | ------------------------ |
3200| [CanvasGradient](ts-components-canvas-canvasgradient.md) | 返回一个渐变对象。 |
3201
3202**返回值:**
3203
3204| 类型     | 说明        |
3205| ------ | --------- |
3206| [CanvasGradient](ts-components-canvas-canvasgradient.md) | 新的CanvasGradient对象,用于在offscreenCanvas上创建渐变效果。 |
3207
3208**示例:**
3209
3210```ts
3211// xxx.ets
3212@Entry
3213@Component
3214struct OffscreenCanvasConicGradientPage {
3215  private settings: RenderingContextSettings = new RenderingContextSettings(true)
3216  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
3217  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
3218
3219  build() {
3220    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
3221      Canvas(this.context)
3222        .width('100%')
3223        .height('100%')
3224        .backgroundColor('#ffffff')
3225        .onReady(() =>{
3226          let offContext = this.offCanvas.getContext("2d", this.settings)
3227          let grad = offContext.createConicGradient(0, 50, 80)
3228          grad.addColorStop(0.0, '#ff0000')
3229          grad.addColorStop(0.5, '#ffffff')
3230          grad.addColorStop(1.0, '#00ff00')
3231          offContext.fillStyle = grad
3232          offContext.fillRect(0, 30, 100, 100)
3233          let image = this.offCanvas.transferToImageBitmap()
3234          this.context.transferFromImageBitmap(image)
3235        })
3236    }
3237    .width('100%')
3238    .height('100%')
3239  }
3240}
3241```
3242
3243  ![zh-cn_image_0000001239032419](figures/zh-cn_image_0000001239032420.png)
3244