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