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