js-components-canvas-canvasrenderingcontext2d.md 53.9 KB
Newer Older
Z
zengyawen 已提交
1 2
# CanvasRenderingContext2D对象

H
geshi  
HelloCrease 已提交
3 4
>  **说明:**
>  从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
Z
zengyawen 已提交
5 6 7

使用CanvasRenderingContext2D在canvas画布组件上进行绘制,绘制对象可以是矩形、文本、图片等。

Z
zengyawen 已提交
8

H
geshi  
HelloCrease 已提交
9 10
**示例:** 
  ```html
Z
zengyawen 已提交
11 12 13
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas1" style="width: 200px; height: 150px; background-color: #ffff00;"></canvas>
W
wangshuainan 已提交
14 15
    <input type="button" style="width: 180px; height: 60px;" value="handleClick" onclick="handleClick" />
    <input type="button" style="width: 180px; height: 60px;" value="antialias" onclick="antialias" />
W
wangshuainan1 已提交
16
  </div>
Z
zengyawen 已提交
17
  ```
W
wangshuainan1 已提交
18

H
geshi  
HelloCrease 已提交
19
  ```js
Z
zengyawen 已提交
20 21 22 23 24 25 26 27 28 29 30
  // xxx.js
  export default {
    handleClick() {
      const el = this.$refs.canvas1;
      const ctx = el.getContext('2d');
      ctx.beginPath();
      ctx.arc(100, 75, 50, 0, 6.28);
      ctx.stroke();
    },
    antialias() {
      const el = this.$refs.canvas1;
W
wangshuainan1 已提交
31
      const ctx = el.getContext('2d', { antialias: true });
W
wangshuainan 已提交
32
      ctx.beginPath();   
W
wangshuainan1 已提交
33 34 35 36
      ctx.arc(100, 75, 50, 0, 6.28);
      ctx.stroke(); 
      }
    }
Z
zengyawen 已提交
37
  ```
H
HelloCrease 已提交
38

Z
zengyawen 已提交
39
- 示意图(关闭抗锯齿)
H
HelloCrease 已提交
40

Z
zengyawen 已提交
41 42 43
  ![zh-cn_image_0000001214837333](figures/zh-cn_image_0000001214837333.png)

- 示意图(开启抗锯齿)
H
HelloCrease 已提交
44

Z
zengyawen 已提交
45 46 47 48 49
  ![zh-cn_image_0000001127125162](figures/zh-cn_image_0000001127125162.png)


## 属性

H
HelloCrease 已提交
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| 名称                                       | 类型                                       | 描述                                       |
| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |
| [fillStyle](#fillstyle)                  | &lt;color&gt;&nbsp;\|&nbsp;[CanvasGradient](../arkui-js/js-components-canvas-canvasgradient.md)&nbsp;\|&nbsp;CanvasPattern | 指定绘制的填充色。<br/>-&nbsp;类型为&lt;color&gt;时,表示设置填充区域的颜色。<br/>-&nbsp;类型为CanvasGradient时,表示渐变对象,使用&nbsp;createLinearGradient()方法创建。<br/>-&nbsp;类型为CanvasPattern时,使用&nbsp;createPattern()方法创建。 |
| [lineWidth](#linewidth)                  | number                                   | 设置绘制线条的宽度。                               |
| [strokeStyle](#strokestyle)              | &lt;color&gt;&nbsp;\|&nbsp;[CanvasGradient](../arkui-js/js-components-canvas-canvasgradient.md)&nbsp;\|&nbsp;CanvasPattern | 设置描边的颜色。<br/>-&nbsp;类型为&lt;color&gt;时,表示设置描边使用的颜色。<br/>-&nbsp;类型为CanvasGradient时,表示渐变对象,使用&nbsp;createLinearGradient()方法创建。<br/>-&nbsp;类型为CanvasPattern时,使用&nbsp;createPattern()方法创建。 |
| [lineCap](#linecap)                      | string                                   | 指定线端点的样式,可选值为:<br/>-&nbsp;butt:线端点以方形结束。<br/>-&nbsp;round:线端点以圆形结束。<br/>-&nbsp;square:线端点以方形结束,该样式下会增加一个长度和线段厚度相同,宽度是线段厚度一半的矩形。<br>默认值:butt |
| [lineJoin](#linejoin)                    | string                                   | 指定线段间相交的交点样式,可选值为:<br/>-&nbsp;round:在线段相连处绘制一个扇形,扇形的圆角半径是线段的宽度。<br/>-&nbsp;bevel:在线段相连处使用三角形为底填充,&nbsp;每个部分矩形拐角独立。<br/>-&nbsp;miter:在相连部分的外边缘处进行延伸,使其相交于一点,形成一个菱形区域,该属性可以通过设置miterLimit属性展现效果。<br>默认值:miter |
| [miterLimit](#miterlimit)                | number                                   | 设置斜接面限制值,该值指定了线条相交处内角和外角的距离。<br>默认值:10   |
| [font](#font)                            | string                                   | 设置文本绘制中的字体样式。<br/>语法:ctx.font="font-style&nbsp;font-weight&nbsp;font-size&nbsp;font-family"<sup>5+</sup><br/>-&nbsp;font-style(可选),用于指定字体样式,支持如下几种样式:normal,&nbsp;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。<br/>-&nbsp;font-family(可选),指定字体系列,支持如下几种类型:sans-serif,&nbsp;serif,&nbsp;monospace。<br>默认值:"normal&nbsp;normal&nbsp;14px&nbsp;sans-serif" |
| [textAlign](#textalign)                  | string                                   | 设置文本绘制中的文本对齐方式,可选值为:<br/>-&nbsp;left:文本左对齐。<br/>-&nbsp;right:文本右对齐。<br/>-&nbsp;center:文本居中对齐。<br/>-&nbsp;start:文本对齐界线开始的地方。<br/>-&nbsp;end:文本对齐界线结束的地方。<br/>ltr布局模式下start和left一致,rtl布局模式下start和right一致。<br>默认值:left |
| [textBaseline](#textbaseline)            | string                                   | 设置文本绘制中的水平对齐方式,可选值为:<br/>-&nbsp;alphabetic:文本基线是标准的字母基线。<br/>-&nbsp;top:文本基线在文本块的顶部。<br/>-&nbsp;hanging:文本基线是悬挂基线。<br/>-&nbsp;middle:文本基线在文本块的中间。<br/>-&nbsp;ideographic:文字基线是表意字基线;如果字符本身超出了alphabetic&nbsp;基线,那么ideographic基线位置在字符本身的底部。<br/>-&nbsp;bottom:文本基线在文本块的底部。&nbsp;&nbsp;ideographic&nbsp;基线的区别在于&nbsp;ideographic&nbsp;基线不需要考虑下行字母。<br>默认值: alphabetic |
| [globalAlpha](#globalalpha)              | number                                   | 设置透明度,0.0为完全透明,1.0为完全不透明。                |
| [lineDashOffset](#linedashoffset)        | number                                   | 设置画布的虚线偏移量,精度为float。<br>默认值:0.0          |
| [globalCompositeOperation](#globalcompositeoperation) | string                                   | 设置合成操作的方式。类型字段可选值有source-over,source-atop,source-in,source-out,destination-over,destination-atop,destination-in,destination-out,lighter,copy,xor。具体请参考[表 类型字段说明](#globalcompositeoperation)<br>默认值:ource-over |
| [shadowBlur](#shadowblur)                | number                                   | 设置绘制阴影时的模糊级别,值越大越模糊,精度为float。<br>默认值:0.0 |
| [shadowColor](#shadowcolor)              | &lt;color&gt;                            | 设置绘制阴影时的阴影颜色。                            |
| [shadowOffsetX](#shadowoffsetx)          | number                                   | 设置绘制阴影时和原有对象的水平偏移值。                      |
| [shadowOffsetY](#shadowoffsety)          | number                                   | 设置绘制阴影时和原有对象的垂直偏移值。                      |
| [imageSmoothingEnabled](#imagesmoothingenabled6)<sup>6+</sup> | boolean                                  | 用于设置绘制图片时是否进行图像平滑度调整,true为启用,false为不启用。<br>默认值:true |
Z
zengyawen 已提交
69 70 71


### fillStyle
Z
zengyawen 已提交
72

H
geshi  
HelloCrease 已提交
73
  ```html
Z
zengyawen 已提交
74 75 76 77
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
</div>
W
wangshuainan1 已提交
78
  ```
Z
zengyawen 已提交
79

H
geshi  
HelloCrease 已提交
80 81
```js
// xxx.js
Z
zengyawen 已提交
82 83 84 85 86 87 88 89
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.fillStyle = '#0000ff';
    ctx.fillRect(20, 20, 150, 100);
  }
}
Z
zengyawen 已提交
90 91
```

Z
zengyawen 已提交
92
![zh-cn_image_0000001166962736](figures/zh-cn_image_0000001166962736.png)
Z
zengyawen 已提交
93

Z
zengyawen 已提交
94 95

### lineWidth
Z
zengyawen 已提交
96

H
geshi  
HelloCrease 已提交
97
```html
Z
zengyawen 已提交
98 99 100 101 102 103
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
</div>
```

H
geshi  
HelloCrease 已提交
104 105
```js
// xxx.js
Z
zengyawen 已提交
106 107 108 109 110 111 112 113
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.lineWidth = 5;
    ctx.strokeRect(25, 25, 85, 105);
  }
}
W
wangshuainan1 已提交
114

Z
zengyawen 已提交
115 116
```

Z
zengyawen 已提交
117 118
![zh-cn_image_0000001166484430](figures/zh-cn_image_0000001166484430.png)

Z
zengyawen 已提交
119

Z
zengyawen 已提交
120
### strokeStyle
Z
zengyawen 已提交
121

H
geshi  
HelloCrease 已提交
122
```html
Z
zengyawen 已提交
123 124 125 126 127 128
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
</div>
```

H
geshi  
HelloCrease 已提交
129 130
```js
// xxx.js
Z
zengyawen 已提交
131 132 133 134 135 136 137 138 139
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.lineWidth = 10;
    ctx.strokeStyle = '#0000ff';
    ctx.strokeRect(25, 25, 155, 105);
  }
}
Z
zengyawen 已提交
140 141 142
```


Z
zengyawen 已提交
143 144 145
![zh-cn_image_0000001212124299](figures/zh-cn_image_0000001212124299.png)

### lineCap
Z
zengyawen 已提交
146

H
geshi  
HelloCrease 已提交
147
```html
Z
zengyawen 已提交
148 149 150 151 152 153
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
</div>
```

H
geshi  
HelloCrease 已提交
154 155
```js
// xxx.js
Z
zengyawen 已提交
156 157 158 159 160 161 162 163 164 165 166 167
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.lineWidth = 8;
    ctx.beginPath();
    ctx.lineCap = 'round';
    ctx.moveTo(30, 50);
    ctx.lineTo(220, 50);
    ctx.stroke();
  }
}
Z
zengyawen 已提交
168 169
```

Z
zengyawen 已提交
170
![zh-cn_image_0000001214837127](figures/zh-cn_image_0000001214837127.png)
Z
zengyawen 已提交
171

Z
zengyawen 已提交
172
### lineJoin
Z
zengyawen 已提交
173

H
geshi  
HelloCrease 已提交
174
```html
Z
zengyawen 已提交
175 176 177 178 179 180
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
</div>
```

H
geshi  
HelloCrease 已提交
181 182
```js 
// xxx.js
Z
zengyawen 已提交
183 184 185 186 187 188 189 190 191 192 193 194 195
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.beginPath();
    ctx.lineWidth = 8;
    ctx.lineJoin = 'miter';
    ctx.moveTo(30, 30);
    ctx.lineTo(120, 60);
    ctx.lineTo(30, 110);
    ctx.stroke();
  }
}
Z
zengyawen 已提交
196 197
```

Z
zengyawen 已提交
198
![zh-cn_image_0000001214717247](figures/zh-cn_image_0000001214717247.png)
Z
zengyawen 已提交
199

Z
zengyawen 已提交
200
### miterLimit
Z
zengyawen 已提交
201

H
geshi  
HelloCrease 已提交
202
```html
Z
zengyawen 已提交
203 204 205 206 207 208
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 500px; height: 500px; "></canvas>
</div>
```

H
geshi  
HelloCrease 已提交
209 210
```js
// xxx.js
Z
zengyawen 已提交
211 212 213 214 215 216 217 218 219 220 221 222 223
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.lineWidth =14;
    ctx.lineJoin = 'miter';
    ctx.miterLimit = 3;
    ctx.moveTo(30, 30);
    ctx.lineTo(120, 60);
    ctx.lineTo(30, 70);
    ctx.stroke();
  }
}
Z
zengyawen 已提交
224 225
```

Z
zengyawen 已提交
226
![zh-cn_image_0000001167001464](figures/zh-cn_image_0000001167001464.png)
Z
zengyawen 已提交
227

Z
zengyawen 已提交
228 229

### font
Z
zengyawen 已提交
230

H
geshi  
HelloCrease 已提交
231
```html
Z
zengyawen 已提交
232 233 234 235 236 237
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
</div>
```

H
geshi  
HelloCrease 已提交
238 239
```js
// xxx.js
Z
zengyawen 已提交
240 241 242 243 244 245 246 247
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.font = '30px sans-serif';
    ctx.fillText("Hello World", 20, 60);
  }
}
Z
zengyawen 已提交
248 249
```

Z
zengyawen 已提交
250 251
![zh-cn_image_0000001167046832](figures/zh-cn_image_0000001167046832.png)

Z
zengyawen 已提交
252

Z
zengyawen 已提交
253
### textAlign
Z
zengyawen 已提交
254

H
geshi  
HelloCrease 已提交
255
```html
Z
zengyawen 已提交
256 257 258 259 260
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
</div>
```
Z
zengyawen 已提交
261

H
geshi  
HelloCrease 已提交
262 263
```js
// xxx.js
Z
zengyawen 已提交
264 265 266 267 268 269 270 271
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.strokeStyle = '#0000ff';
    ctx.moveTo(140, 10);
    ctx.lineTo(140, 160);
    ctx.stroke();
W
wangshuainan1 已提交
272 273 274 275 276 277 278
    ctx.font = '18px sans-serif'; 
    // Show the different textAlign values
    ctx.textAlign = 'start'; 
    ctx.fillText('textAlign=start', 140, 60);
    ctx.textAlign = 'end';
    ctx.fillText('textAlign=end', 140, 80);
    ctx.textAlign = 'left'; 
Z
zengyawen 已提交
279
    ctx.fillText('textAlign=left', 140, 100);
W
wangshuainan1 已提交
280 281 282
    ctx.textAlign = 'center'; 
    ctx.fillText('textAlign=center',140, 120);
    ctx.textAlign = 'right';
Z
zengyawen 已提交
283 284 285
    ctx.fillText('textAlign=right',140, 140);
  }
}
W
wangshuainan1 已提交
286

Z
zengyawen 已提交
287 288 289
```


Z
zengyawen 已提交
290 291 292
![zh-cn_image_0000001167472798](figures/zh-cn_image_0000001167472798.png)

### textBaseline
Z
zengyawen 已提交
293

H
geshi  
HelloCrease 已提交
294
```html
Z
zengyawen 已提交
295 296 297 298 299
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 500px; height: 500px; "></canvas>
</div>
```
Z
zengyawen 已提交
300

H
geshi  
HelloCrease 已提交
301 302
```js
// xxx.js
Z
zengyawen 已提交
303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.strokeStyle = '#0000ff';
    ctx.moveTo(0, 120);
    ctx.lineTo(400, 120);
    ctx.stroke();
    ctx.font = '20px sans-serif';
    ctx.textBaseline = 'top'; 
    ctx.fillText('Top', 10, 120); 
    ctx.textBaseline = 'bottom'; 
    ctx.fillText('Bottom', 55, 120); 
    ctx.textBaseline = 'middle'; 
    ctx.fillText('Middle', 125, 120); 
    ctx.textBaseline = 'alphabetic'; 
    ctx.fillText('Alphabetic', 195, 120); 
    ctx.textBaseline = 'hanging'; 
    ctx.fillText('Hanging', 295, 120);
  }
}
Z
zengyawen 已提交
324 325
```

Z
zengyawen 已提交
326
![zh-cn_image_0000001169315920](figures/zh-cn_image_0000001169315920.png)
Z
zengyawen 已提交
327

Z
zengyawen 已提交
328
### globalAlpha
Z
zengyawen 已提交
329

H
geshi  
HelloCrease 已提交
330
```html
Z
zengyawen 已提交
331 332 333 334 335 336
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
</div>
```

H
geshi  
HelloCrease 已提交
337 338
```js
// xxx.js
Z
zengyawen 已提交
339 340 341 342 343 344 345 346 347
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.fillStyle = 'rgb(255,0,0)';
    ctx.fillRect(0, 0, 50, 50);
    ctx.globalAlpha = 0.4;
    ctx.fillStyle = 'rgb(0,0,255)'; 
    ctx.fillRect(50, 50, 50, 50);
W
wangshuainan1 已提交
348

Z
zengyawen 已提交
349 350
  }
}
Z
zengyawen 已提交
351 352
```

Z
zengyawen 已提交
353
![zh-cn_image_0000001167953648](figures/zh-cn_image_0000001167953648.png)
Z
zengyawen 已提交
354

Z
zengyawen 已提交
355
### lineDashOffset
Z
zengyawen 已提交
356

H
geshi  
HelloCrease 已提交
357
```html
Z
zengyawen 已提交
358 359 360 361 362 363
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px; background-color: #ffff00;"></canvas>
</div>
```

H
geshi  
HelloCrease 已提交
364 365
```js
// xxx.js
Z
zengyawen 已提交
366 367 368 369 370 371 372 373 374 375
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.arc(100, 75, 50, 0, 6.28);
    ctx.setLineDash([10,20]);
    ctx.lineDashOffset = 10.0;
    ctx.stroke();
  }
}
Z
zengyawen 已提交
376 377
```

Z
zengyawen 已提交
378 379 380 381
![zh-cn_image_0000001167950468](figures/zh-cn_image_0000001167950468.png)

### globalCompositeOperation

H
geshi  
HelloCrease 已提交
382
类型字段说明
B
bmeangel 已提交
383

H
geshi  
HelloCrease 已提交
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404
| 值                | 描述                       |
| ---------------- | ------------------------ |
| source-over      | 在现有绘制内容上显示新绘制内容,属于默认值。   |
| source-atop      | 在现有绘制内容顶部显示新绘制内容。        |
| source-in        | 在现有绘制内容中显示新绘制内容。         |
| source-out       | 在现有绘制内容之外显示新绘制内容。        |
| destination-over | 在新绘制内容上方显示现有绘制内容。        |
| destination-atop | 在新绘制内容顶部显示现有绘制内容。        |
| destination-in   | 在新绘制内容中显示现有绘制内容。         |
| destination-out  | 在新绘制内容外显示现有绘制内容。         |
| lighter          | 显示新绘制内容和现有绘制内容。          |
| copy             | 显示新绘制内容而忽略现有绘制内容。        |
| xor              | 使用异或操作对新绘制内容与现有绘制内容进行融合。 |

**示例:** 

```html
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
</div>
W
wangshuainan1 已提交
405
```
Z
zengyawen 已提交
406

H
geshi  
HelloCrease 已提交
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
  ```js
// xxx.js
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.fillStyle = 'rgb(255,0,0)';
    ctx.fillRect(20, 20, 50, 50);
    ctx.globalCompositeOperation = 'source-over';
    ctx.fillStyle = 'rgb(0,0,255)';
    ctx.fillRect(50, 50, 50, 50);
    // Start drawing second example
    ctx.fillStyle = 'rgb(255,0,0)';
    ctx.fillRect(120, 20, 50, 50);
    ctx.globalCompositeOperation = 'destination-over';
    ctx.fillStyle = 'rgb(0,0,255)';
    ctx.fillRect(150, 50, 50, 50);
Z
zengyawen 已提交
424
  }
H
geshi  
HelloCrease 已提交
425
}
Z
zengyawen 已提交
426
  ```
Z
zengyawen 已提交
427

Z
zengyawen 已提交
428
  ![zh-cn_image_0000001213192781](figures/zh-cn_image_0000001213192781.png)
Z
zengyawen 已提交
429

Z
zengyawen 已提交
430
  示例中,新绘制内容是蓝色矩形,现有绘制内容是红色矩形。
Z
zengyawen 已提交
431

Z
zengyawen 已提交
432
### shadowBlur
Z
zengyawen 已提交
433

H
geshi  
HelloCrease 已提交
434
  ```html
Z
zengyawen 已提交
435 436 437 438
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
</div>
W
wangshuainan1 已提交
439
  ```
Z
zengyawen 已提交
440

H
geshi  
HelloCrease 已提交
441 442
```js
// xxx.js
Z
zengyawen 已提交
443 444 445 446 447 448 449 450 451 452
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.shadowBlur = 30;
    ctx.shadowColor = 'rgb(0,0,0)';
    ctx.fillStyle = 'rgb(255,0,0)';
    ctx.fillRect(20, 20, 100, 80);
  }
}
Z
zengyawen 已提交
453 454
```

Z
zengyawen 已提交
455
![zh-cn_image_0000001168111514](figures/zh-cn_image_0000001168111514.png)
Z
zengyawen 已提交
456

Z
zengyawen 已提交
457
### shadowColor
Z
zengyawen 已提交
458

H
geshi  
HelloCrease 已提交
459
```html
Z
zengyawen 已提交
460 461 462 463 464 465
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
</div>
```

H
geshi  
HelloCrease 已提交
466 467
```js
// xxx.js
Z
zengyawen 已提交
468 469 470 471 472 473 474 475 476 477
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.shadowBlur = 30;
    ctx.shadowColor = 'rgb(0,0,255)';
    ctx.fillStyle = 'rgb(255,0,0)';
    ctx.fillRect(30, 30, 100, 100);
  }
}
Z
zengyawen 已提交
478 479
```

Z
zengyawen 已提交
480
![zh-cn_image_0000001168111610](figures/zh-cn_image_0000001168111610.png)
Z
zengyawen 已提交
481

Z
zengyawen 已提交
482
### shadowOffsetX
Z
zengyawen 已提交
483

H
geshi  
HelloCrease 已提交
484
```html
Z
zengyawen 已提交
485 486 487 488 489 490
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
</div>
```

H
geshi  
HelloCrease 已提交
491 492
```js
// xxx.js
Z
zengyawen 已提交
493 494 495 496 497 498 499 500 501 502 503
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.shadowBlur = 10;
    ctx.shadowOffsetX = 20;
    ctx.shadowColor = 'rgb(0,0,0)';
    ctx.fillStyle = 'rgb(255,0,0)';
    ctx.fillRect(20, 20, 100, 80);
  }
}
Z
zengyawen 已提交
504 505 506
```


Z
zengyawen 已提交
507 508 509
![zh-cn_image_0000001167631876](figures/zh-cn_image_0000001167631876.png)

### shadowOffsetY
Z
zengyawen 已提交
510

H
geshi  
HelloCrease 已提交
511
```html
Z
zengyawen 已提交
512 513 514 515 516 517
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
</div>
```

H
geshi  
HelloCrease 已提交
518 519
```js
// xxx.js
Z
zengyawen 已提交
520 521 522 523 524 525 526 527 528 529 530
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    ctx.shadowBlur = 10;
    ctx.shadowOffsetY = 20;
    ctx.shadowColor = 'rgb(0,0,0)';
    ctx.fillStyle = 'rgb(255,0,0)';
    ctx.fillRect(30, 30, 100, 100);
 }
}
Z
zengyawen 已提交
531 532
```

Z
zengyawen 已提交
533
![zh-cn_image_0000001213193285](figures/zh-cn_image_0000001213193285.png)
Z
zengyawen 已提交
534

Z
zengyawen 已提交
535
### imageSmoothingEnabled<sup>6+</sup>
Z
zengyawen 已提交
536

H
geshi  
HelloCrease 已提交
537
```html
Z
zengyawen 已提交
538 539 540 541 542 543
<!-- xxx.hml -->
<div>
  <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
</div>
```

H
geshi  
HelloCrease 已提交
544 545
```js
// xxx.js
Z
zengyawen 已提交
546 547 548 549 550 551 552 553 554 555 556 557
export default {
  onShow() {
    const el =this.$refs.canvas;
    const ctx = el.getContext('2d');
    var img = new Image();
    img.src = 'common/image/example.jpg';
    img.onload = function() {
    ctx.imageSmoothingEnabled = false;
    ctx.drawImage(img, 0, 0, 400, 200);
    };
  }
}
Z
zengyawen 已提交
558 559
```

Z
zengyawen 已提交
560 561 562
![zh-cn_image_0000001167952236](figures/zh-cn_image_0000001167952236.png)


Z
zengyawen 已提交
563

Z
zengyawen 已提交
564
## 方法
Z
zengyawen 已提交
565 566


Z
zengyawen 已提交
567 568 569
### fillRect

fillRect(x: number, y: number, width:number, height: number): void
Z
zengyawen 已提交
570 571 572

填充一个矩形。

H
geshi  
HelloCrease 已提交
573
**参数:** 
B
bmeangel 已提交
574

H
geshi  
HelloCrease 已提交
575 576 577 578 579 580
| 参数     | 类型     | 描述            |
| ------ | ------ | ------------- |
| x      | number | 指定矩形左上角点的x坐标。 |
| y      | number | 指定矩形左上角点的y坐标。 |
| width  | number | 指定矩形的宽度。      |
| height | number | 指定矩形的高度。      |
Z
zengyawen 已提交
581

H
geshi  
HelloCrease 已提交
582 583 584
**示例:** 

```html
Z
zengyawen 已提交
585 586 587 588
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
  </div>
W
wangshuainan1 已提交
589
```
Z
zengyawen 已提交
590

H
geshi  
HelloCrease 已提交
591
  ```js
Z
zengyawen 已提交
592 593 594 595 596 597
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.fillRect(20, 20, 200, 150);
Z
zengyawen 已提交
598
    }
Z
zengyawen 已提交
599 600
  }
  ```
Z
zengyawen 已提交
601

Z
zengyawen 已提交
602
  ![zh-cn_image_0000001214811029](figures/zh-cn_image_0000001214811029.png)
Z
zengyawen 已提交
603

Z
zengyawen 已提交
604
### clearRect
Z
zengyawen 已提交
605

Z
zengyawen 已提交
606
clearRect(x: number, y: number, width:number, height: number): void
Z
zengyawen 已提交
607 608 609

删除指定区域内的绘制内容。

H
geshi  
HelloCrease 已提交
610
**参数:** 
B
bmeangel 已提交
611

H
geshi  
HelloCrease 已提交
612 613 614 615 616 617
| 参数     | 类型     | 描述            |
| ------ | ------ | ------------- |
| x      | number | 指定矩形上的左上角x坐标。 |
| y      | number | 指定矩形上的左上角y坐标。 |
| width  | number | 指定矩形的宽度。      |
| height | number | 指定矩形的高度。      |
Z
zengyawen 已提交
618

H
geshi  
HelloCrease 已提交
619 620
**示例:** 
  ```html
Z
zengyawen 已提交
621 622 623 624 625 626
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
627
  ```js
Z
zengyawen 已提交
628 629 630 631 632 633 634 635
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.fillStyle = 'rgb(0,0,255)';
      ctx.fillRect(0, 0, 400, 200);
      ctx.clearRect(20, 20, 150, 100);
Z
zengyawen 已提交
636
    }
Z
zengyawen 已提交
637 638
  }
  ```
Z
zengyawen 已提交
639

Z
zengyawen 已提交
640
  ![zh-cn_image_0000001214619417](figures/zh-cn_image_0000001214619417.png)
Z
zengyawen 已提交
641 642


Z
zengyawen 已提交
643
### strokeRect
Z
zengyawen 已提交
644

Z
zengyawen 已提交
645
strokeRect(x: number, y: number, width:number, height: number): void
Z
zengyawen 已提交
646 647 648

绘制具有边框的矩形,矩形内部不填充。

H
geshi  
HelloCrease 已提交
649
**参数:** 
B
bmeangel 已提交
650

H
geshi  
HelloCrease 已提交
651 652 653 654 655 656
| 参数     | 类型     | 描述           |
| ------ | ------ | ------------ |
| x      | number | 指定矩形的左上角x坐标。 |
| y      | number | 指定矩形的左上角y坐标。 |
| width  | number | 指定矩形的宽度。     |
| height | number | 指定矩形的高度。     |
Z
zengyawen 已提交
657

H
geshi  
HelloCrease 已提交
658 659
**示例:** 
  ```html
Z
zengyawen 已提交
660 661 662 663 664 665
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
666
  ```js
Z
zengyawen 已提交
667 668 669 670 671 672
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.strokeRect(30, 30, 200, 150);
Z
zengyawen 已提交
673
    }
Z
zengyawen 已提交
674 675
  }
  ```
Z
zengyawen 已提交
676

Z
zengyawen 已提交
677
  ![zh-cn_image_0000001214822091](figures/zh-cn_image_0000001214822091.png)
Z
zengyawen 已提交
678 679


Z
zengyawen 已提交
680
### fillText
Z
zengyawen 已提交
681

Z
zengyawen 已提交
682
fillText(text: string, x: number, y: number): void
Z
zengyawen 已提交
683 684 685

绘制填充类文本。

H
geshi  
HelloCrease 已提交
686
**参数:** 
B
bmeangel 已提交
687

H
geshi  
HelloCrease 已提交
688 689 690 691 692
| 参数   | 类型     | 描述              |
| ---- | ------ | --------------- |
| text | string | 需要绘制的文本内容。      |
| x    | number | 需要绘制的文本的左下角x坐标。 |
| y    | number | 需要绘制的文本的左下角y坐标。 |
Z
zengyawen 已提交
693

H
geshi  
HelloCrease 已提交
694 695
**示例:** 
  ```html
Z
zengyawen 已提交
696 697 698 699 700 701
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
702
  ```js
Z
zengyawen 已提交
703 704 705 706 707 708 709
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.font = '35px sans-serif';
      ctx.fillText("Hello World!", 10, 60);
Z
zengyawen 已提交
710
    }
Z
zengyawen 已提交
711 712
  }
  ```
Z
zengyawen 已提交
713

Z
zengyawen 已提交
714
  ![zh-cn_image_0000001214469787](figures/zh-cn_image_0000001214469787.png)
Z
zengyawen 已提交
715

Z
zengyawen 已提交
716
### strokeText
Z
zengyawen 已提交
717

Z
zengyawen 已提交
718
strokeText(text: string, x: number, y: number): void
Z
zengyawen 已提交
719 720 721

绘制描边类文本。

H
geshi  
HelloCrease 已提交
722
**参数:** 
B
bmeangel 已提交
723

H
geshi  
HelloCrease 已提交
724 725 726 727 728
| 参数   | 类型     | 描述              |
| ---- | ------ | --------------- |
| text | string | 需要绘制的文本内容。      |
| x    | number | 需要绘制的文本的左下角x坐标。 |
| y    | number | 需要绘制的文本的左下角y坐标。 |
Z
zengyawen 已提交
729

H
geshi  
HelloCrease 已提交
730 731
**示例:** 
  ```html
Z
zengyawen 已提交
732 733 734 735 736 737
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
738
  ```js
Z
zengyawen 已提交
739 740 741 742 743 744 745
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.font = '25px sans-serif';
      ctx.strokeText("Hello World!", 10, 60);
Z
zengyawen 已提交
746
    }
Z
zengyawen 已提交
747 748
  }
  ```
Z
zengyawen 已提交
749

Z
zengyawen 已提交
750
  ![zh-cn_image_0000001214460669](figures/zh-cn_image_0000001214460669.png)
Z
zengyawen 已提交
751

Z
zengyawen 已提交
752
### measureText
Z
zengyawen 已提交
753

Z
zengyawen 已提交
754
measureText(text: string): TextMetrics
Z
zengyawen 已提交
755 756 757

该方法返回一个文本测算的对象,通过该对象可以获取指定文本的宽度值。

H
geshi  
HelloCrease 已提交
758
**参数:** 
B
bmeangel 已提交
759

H
geshi  
HelloCrease 已提交
760 761 762
| 参数   | 类型     | 描述         |
| ---- | ------ | ---------- |
| text | string | 需要进行测量的文本。 |
Z
zengyawen 已提交
763

H
geshi  
HelloCrease 已提交
764
**返回值:** 
B
bmeangel 已提交
765

H
geshi  
HelloCrease 已提交
766 767 768
| 类型          | 说明                                     |
| ----------- | -------------------------------------- |
| TextMetrics | 包含指定字体的宽度,该宽度可以通过TextMetrics.width来获取。 |
Z
zengyawen 已提交
769

H
geshi  
HelloCrease 已提交
770 771
**示例:** 
  ```html
Z
zengyawen 已提交
772 773 774 775 776 777
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
778
  ```js
Z
zengyawen 已提交
779 780 781 782 783 784 785 786 787
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.font = '20px sans-serif';
      var txt = 'Hello World';
      ctx.fillText("width:" + ctx.measureText(txt).width, 20, 60);
      ctx.fillText(txt, 20, 110);
Z
zengyawen 已提交
788
    }
Z
zengyawen 已提交
789 790
  }
  ```
Z
zengyawen 已提交
791

Z
zengyawen 已提交
792
  ![zh-cn_image_0000001169142476](figures/zh-cn_image_0000001169142476.png)
Z
zengyawen 已提交
793 794


Z
zengyawen 已提交
795 796
### stroke
stroke(): void
Z
zengyawen 已提交
797 798 799

进行边框绘制操作。

H
geshi  
HelloCrease 已提交
800 801
**示例:** 
  ```html
Z
zengyawen 已提交
802 803 804 805 806 807
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
808
  ```js
Z
zengyawen 已提交
809 810 811 812 813 814 815 816 817 818
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.moveTo(25, 25);
      ctx.lineTo(25, 250);
      ctx.lineWidth = '6';
      ctx.strokeStyle = 'rgb(0,0,255)';
      ctx.stroke();
Z
zengyawen 已提交
819
    }
Z
zengyawen 已提交
820 821
  }
  ```
Z
zengyawen 已提交
822

Z
zengyawen 已提交
823
  ![zh-cn_image_0000001236697937](figures/zh-cn_image_0000001236697937.png)
Z
zengyawen 已提交
824 825


Z
zengyawen 已提交
826 827
### beginPath
beginPath(): void
Z
zengyawen 已提交
828 829 830

创建一个新的绘制路径。

H
geshi  
HelloCrease 已提交
831 832
**示例:** 
  ```html
Z
zengyawen 已提交
833 834 835 836 837 838
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 500px; height: 500px; "></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
839
  ```js
Z
zengyawen 已提交
840 841 842 843 844 845 846 847 848 849 850
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.beginPath();              
      ctx.lineWidth = '6';
      ctx.strokeStyle = '#0000ff';
      ctx.moveTo(15, 80); 
      ctx.lineTo(280, 80);
      ctx.stroke();
Z
zengyawen 已提交
851
    }
Z
zengyawen 已提交
852 853
  }
  ```
Z
zengyawen 已提交
854

Z
zengyawen 已提交
855
  ![zh-cn_image_0000001214629745](figures/zh-cn_image_0000001214629745.png)
Z
zengyawen 已提交
856 857


Z
zengyawen 已提交
858 859
### moveTo
moveTo(x: number, y: number): void
Z
zengyawen 已提交
860 861 862

路径从当前点移动到指定点。

H
geshi  
HelloCrease 已提交
863
**参数:** 
B
bmeangel 已提交
864

H
geshi  
HelloCrease 已提交
865 866 867 868
| 参数   | 类型     | 描述        |
| ---- | ------ | --------- |
| x    | number | 指定位置的x坐标。 |
| y    | number | 指定位置的y坐标。 |
Z
zengyawen 已提交
869

H
geshi  
HelloCrease 已提交
870 871
**示例:** 
  ```html
Z
zengyawen 已提交
872 873 874 875 876 877
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
878
  ```js
Z
zengyawen 已提交
879 880 881 882 883 884 885 886 887
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.beginPath();
      ctx.moveTo(10, 10);
      ctx.lineTo(280, 160);
      ctx.stroke();
Z
zengyawen 已提交
888
    }
Z
zengyawen 已提交
889 890
  }
  ```
Z
zengyawen 已提交
891

Z
zengyawen 已提交
892
  ![zh-cn_image_0000001169309948](figures/zh-cn_image_0000001169309948.png)
Z
zengyawen 已提交
893 894


Z
zengyawen 已提交
895 896
### lineTo
lineTo(x: number, y: number): void
Z
zengyawen 已提交
897 898 899

从当前点到指定点进行路径连接。

H
geshi  
HelloCrease 已提交
900
**参数:** 
B
bmeangel 已提交
901

H
geshi  
HelloCrease 已提交
902 903 904 905
| 参数   | 类型     | 描述        |
| ---- | ------ | --------- |
| x    | number | 指定位置的x坐标。 |
| y    | number | 指定位置的y坐标。 |
Z
zengyawen 已提交
906

H
geshi  
HelloCrease 已提交
907 908
**示例:** 
  ```html
Z
zengyawen 已提交
909 910 911 912 913 914
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
915
  ```js
Z
zengyawen 已提交
916 917 918 919 920 921 922 923 924
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.beginPath();
      ctx.moveTo(10, 10);
      ctx.lineTo(280, 160);
      ctx.stroke();
Z
zengyawen 已提交
925
    }
Z
zengyawen 已提交
926 927
  }
  ```
Z
zengyawen 已提交
928

Z
zengyawen 已提交
929
  ![zh-cn_image_0000001169469914](figures/zh-cn_image_0000001169469914.png)
Z
zengyawen 已提交
930 931


Z
zengyawen 已提交
932 933
### closePath
closePath(): void
Z
zengyawen 已提交
934 935 936

结束当前路径形成一个封闭路径。

H
geshi  
HelloCrease 已提交
937 938
**示例:** 
  ```html
Z
zengyawen 已提交
939 940 941 942 943 944
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
945
  ```js
Z
zengyawen 已提交
946 947 948 949 950 951 952 953 954 955 956
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.beginPath();
      ctx.moveTo(30, 30);
      ctx.lineTo(110, 30);
      ctx.lineTo(70, 90);
      ctx.closePath();
      ctx.stroke();
Z
zengyawen 已提交
957
    }
Z
zengyawen 已提交
958 959
  }
  ```
Z
zengyawen 已提交
960

Z
zengyawen 已提交
961
  ![zh-cn_image_0000001169151508](figures/zh-cn_image_0000001169151508.png)
Z
zengyawen 已提交
962

Z
zengyawen 已提交
963
### createPattern
Z
zengyawen 已提交
964

Z
zengyawen 已提交
965
createPattern(image: Image, repetition: string): Object
Z
zengyawen 已提交
966 967 968

通过指定图像和重复方式创建图片填充的模板。

H
geshi  
HelloCrease 已提交
969
**参数:** 
B
bmeangel 已提交
970

H
geshi  
HelloCrease 已提交
971 972 973 974
| 参数         | 类型     | 描述                                       |
| ---------- | ------ | ---------------------------------------- |
| image      | Image  | 图源对象,具体参考[Image对象](../arkui-js/js-components-canvas-image.md)。 |
| repetition | string | 设置图像重复的方式,取值为:'repeat'、'repeat-x'、&nbsp;'repeat-y'、'no-repeat'。 |
Z
zengyawen 已提交
975

H
geshi  
HelloCrease 已提交
976
**返回值:** 
B
bmeangel 已提交
977

H
geshi  
HelloCrease 已提交
978 979 980
| 类型     | 说明                |
| ------ | ----------------- |
| Object | 指定图像填充的Pattern对象。 |
Z
zengyawen 已提交
981

H
geshi  
HelloCrease 已提交
982 983
**示例:** 
  ```html
Z
zengyawen 已提交
984 985 986 987 988 989
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
990
  ```js
Z
zengyawen 已提交
991 992 993 994 995 996 997 998 999 1000
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      var img = new Image();
      img.src = 'common/images/example.jpg';
      var pat = ctx.createPattern(img, 'repeat');
      ctx.fillStyle = pat;
      ctx.fillRect(0, 0, 20, 20);
Z
zengyawen 已提交
1001
    }
Z
zengyawen 已提交
1002 1003
  }
  ```
Z
zengyawen 已提交
1004

Z
zengyawen 已提交
1005
  ![zh-cn_image_0000001169301188](figures/zh-cn_image_0000001169301188.png)
Z
zengyawen 已提交
1006

Z
zengyawen 已提交
1007
### bezierCurveTo
Z
zengyawen 已提交
1008

Z
zengyawen 已提交
1009
bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void
Z
zengyawen 已提交
1010 1011 1012

创建三次贝赛尔曲线的路径。

H
geshi  
HelloCrease 已提交
1013
**参数:** 
B
bmeangel 已提交
1014

H
geshi  
HelloCrease 已提交
1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
| 参数   | 类型     | 描述             |
| ---- | ------ | -------------- |
| cp1x | number | 第一个贝塞尔参数的x坐标值。 |
| cp1y | number | 第一个贝塞尔参数的y坐标值。 |
| cp2x | number | 第二个贝塞尔参数的x坐标值。 |
| cp2y | number | 第二个贝塞尔参数的y坐标值。 |
| x    | number | 路径结束时的x坐标值。    |
| y    | number | 路径结束时的y坐标值。    |

**示例:** 
  ```html
Z
zengyawen 已提交
1026 1027 1028 1029 1030 1031
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; background-color: #ffff00;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1032
  ```js
Z
zengyawen 已提交
1033 1034 1035 1036 1037 1038 1039 1040 1041
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.beginPath();
      ctx.moveTo(10, 10);
      ctx.bezierCurveTo(20, 100, 200, 100, 200, 20);
      ctx.stroke();
Z
zengyawen 已提交
1042
    }
Z
zengyawen 已提交
1043 1044
  }
  ```
Z
zengyawen 已提交
1045

Z
zengyawen 已提交
1046
  ![zh-cn_image_0000001214621177](figures/zh-cn_image_0000001214621177.png)
Z
zengyawen 已提交
1047

Z
zengyawen 已提交
1048
### quadraticCurveTo
Z
zengyawen 已提交
1049

Z
zengyawen 已提交
1050
quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void
Z
zengyawen 已提交
1051 1052 1053

创建二次贝赛尔曲线的路径。

H
geshi  
HelloCrease 已提交
1054
**参数:** 
B
bmeangel 已提交
1055

H
geshi  
HelloCrease 已提交
1056 1057 1058 1059 1060 1061
| 参数   | 类型     | 描述          |
| ---- | ------ | ----------- |
| cpx  | number | 贝塞尔参数的x坐标值。 |
| cpy  | number | 贝塞尔参数的y坐标值。 |
| x    | number | 路径结束时的x坐标值。 |
| y    | number | 路径结束时的y坐标值。 |
Z
zengyawen 已提交
1062

H
geshi  
HelloCrease 已提交
1063 1064
**示例:** 
  ```html
Z
zengyawen 已提交
1065 1066 1067 1068 1069 1070
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1071
  ```js
Z
zengyawen 已提交
1072 1073 1074 1075 1076 1077 1078 1079 1080
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.beginPath();
      ctx.moveTo(20, 20);
      ctx.quadraticCurveTo(100, 100, 200, 20);
      ctx.stroke();
Z
zengyawen 已提交
1081
    }
Z
zengyawen 已提交
1082 1083
  }
  ```
Z
zengyawen 已提交
1084

Z
zengyawen 已提交
1085
  ![zh-cn_image_0000001169461910](figures/zh-cn_image_0000001169461910.png)
Z
zengyawen 已提交
1086 1087


Z
zengyawen 已提交
1088 1089
### arc
arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise: boolean): void
Z
zengyawen 已提交
1090 1091 1092

绘制弧线路径。

H
geshi  
HelloCrease 已提交
1093
**参数:** 
B
bmeangel 已提交
1094

H
geshi  
HelloCrease 已提交
1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105
| 参数            | 类型      | 描述         |
| ------------- | ------- | ---------- |
| x             | number  | 弧线圆心的x坐标值。 |
| y             | number  | 弧线圆心的y坐标值。 |
| radius        | number  | 弧线的圆半径。    |
| startAngle    | number  | 弧线的起始弧度。   |
| endAngle      | number  | 弧线的终止弧度。   |
| anticlockwise | boolean | 是否逆时针绘制圆弧。 |

**示例:** 
  ```html
Z
zengyawen 已提交
1106 1107 1108 1109 1110 1111
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1112
  ```js
Z
zengyawen 已提交
1113 1114 1115 1116 1117 1118 1119 1120
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.beginPath();
      ctx.arc(100, 75, 50, 0, 6.28);
      ctx.stroke();
Z
zengyawen 已提交
1121
    }
Z
zengyawen 已提交
1122 1123
  }
  ```
Z
zengyawen 已提交
1124

Z
zengyawen 已提交
1125
  ![zh-cn_image_0000001169470288](figures/zh-cn_image_0000001169470288.png)
Z
zengyawen 已提交
1126

Z
zengyawen 已提交
1127
### arcTo
Z
zengyawen 已提交
1128

Z
zengyawen 已提交
1129
arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void
Z
zengyawen 已提交
1130 1131 1132

依据圆弧经过的点和圆弧半径创建圆弧路径。

H
geshi  
HelloCrease 已提交
1133
**参数:** 
B
bmeangel 已提交
1134

H
geshi  
HelloCrease 已提交
1135 1136 1137 1138 1139 1140 1141 1142 1143 1144
| 参数     | 类型     | 描述              |
| ------ | ------ | --------------- |
| x1     | number | 圆弧经过的第一个点的x坐标值。 |
| y1     | number | 圆弧经过的第一个点的y坐标值。 |
| x2     | number | 圆弧经过的第二个点的x坐标值。 |
| y2     | number | 圆弧经过的第二个点的y坐标值。 |
| radius | number | 圆弧的圆半径值。        |

**示例:** 
  ```html
Z
zengyawen 已提交
1145 1146 1147 1148 1149 1150
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1151
  ```js
Z
zengyawen 已提交
1152 1153 1154 1155 1156 1157 1158 1159
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.moveTo(100, 20);
      ctx.arcTo(150, 20, 150, 70, 50); // Create an arc
      ctx.stroke();
Z
zengyawen 已提交
1160
    }
Z
zengyawen 已提交
1161 1162
  }
  ```
Z
zengyawen 已提交
1163

Z
zengyawen 已提交
1164
  ![zh-cn_image_0000001169143586](figures/zh-cn_image_0000001169143586.png)
Z
zengyawen 已提交
1165

Z
zengyawen 已提交
1166
### ellipse<sup>6+</sup>
Z
zengyawen 已提交
1167

Z
zengyawen 已提交
1168
ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise: number): void
Z
zengyawen 已提交
1169 1170 1171

在规定的矩形区域绘制一个椭圆。

H
geshi  
HelloCrease 已提交
1172
**参数:** 
B
bmeangel 已提交
1173

H
geshi  
HelloCrease 已提交
1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186
| 参数            | 类型     | 描述                                   |
| ------------- | ------ | ------------------------------------ |
| x             | number | 椭圆圆心的x轴坐标。                           |
| y             | number | 椭圆圆心的y轴坐标。                           |
| radiusX       | number | 椭圆x轴的半径长度。                           |
| radiusY       | number | 椭圆y轴的半径长度。                           |
| rotation      | number | 椭圆的旋转角度,单位为弧度。                       |
| startAngle    | number | 椭圆绘制的起始点角度,以弧度表示。                    |
| endAngle      | number | 椭圆绘制的结束点角度,以弧度表示。                    |
| anticlockwise | number | 是否以逆时针方向绘制椭圆,0为顺时针,1为逆时针。(可选参数,默认为0) |

**示例:** 
  ```html
Z
zengyawen 已提交
1187 1188 1189 1190 1191 1192
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 500px; height: 500px; background-color: #ffff00;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1193
  ```js
Z
zengyawen 已提交
1194 1195 1196 1197 1198 1199 1200 1201
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.beginPath();
      ctx.ellipse(200, 200, 50, 100, Math.PI * 0.25, Math.PI * 0.5, Math.PI, 1);
      ctx.stroke();
Z
zengyawen 已提交
1202
    }
Z
zengyawen 已提交
1203 1204
  }
  ```
Z
zengyawen 已提交
1205

Z
zengyawen 已提交
1206
  ![zh-cn_image_0000001214823665](figures/zh-cn_image_0000001214823665.png)
Z
zengyawen 已提交
1207 1208


Z
zengyawen 已提交
1209 1210
### rect
rect(x: number, y: number, width: number, height: number): void
Z
zengyawen 已提交
1211 1212 1213

创建矩形路径。

H
geshi  
HelloCrease 已提交
1214
**参数:** 
B
bmeangel 已提交
1215

H
geshi  
HelloCrease 已提交
1216 1217 1218 1219 1220 1221
| 参数     | 类型     | 描述            |
| ------ | ------ | ------------- |
| x      | number | 指定矩形的左上角x坐标值。 |
| y      | number | 指定矩形的左上角y坐标值。 |
| width  | number | 指定矩形的宽度。      |
| height | number | 指定矩形的高度。      |
Z
zengyawen 已提交
1222

H
geshi  
HelloCrease 已提交
1223 1224
**示例:** 
  ```html
Z
zengyawen 已提交
1225 1226 1227 1228 1229 1230
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1231
  ```js
Z
zengyawen 已提交
1232 1233 1234 1235 1236 1237 1238
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.rect(20, 20, 100, 100); // Create a 100*100 rectangle at (20, 20)
      ctx.stroke(); // Draw it
Z
zengyawen 已提交
1239
    }
Z
zengyawen 已提交
1240 1241
  }
  ```
Z
zengyawen 已提交
1242

Z
zengyawen 已提交
1243
  ![zh-cn_image_0000001214630783](figures/zh-cn_image_0000001214630783.png)
Z
zengyawen 已提交
1244

Z
zengyawen 已提交
1245
### fill
Z
zengyawen 已提交
1246

Z
zengyawen 已提交
1247
fill(): void
Z
zengyawen 已提交
1248 1249 1250

对封闭路径进行填充。

H
geshi  
HelloCrease 已提交
1251 1252
**示例:** 
  ```html
Z
zengyawen 已提交
1253 1254 1255 1256 1257 1258
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1259
  ```js
Z
zengyawen 已提交
1260 1261 1262 1263 1264 1265 1266
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.rect(20, 20, 100, 100); // Create a 100*100 rectangle at (20, 20)
      ctx.fill(); // Draw it in default setting
Z
zengyawen 已提交
1267
    }
Z
zengyawen 已提交
1268 1269
  }
  ```
Z
zengyawen 已提交
1270

Z
zengyawen 已提交
1271
  ![zh-cn_image_0000001214703717](figures/zh-cn_image_0000001214703717.png)
Z
zengyawen 已提交
1272

Z
zengyawen 已提交
1273
### clip
Z
zengyawen 已提交
1274

Z
zengyawen 已提交
1275
clip(): void
Z
zengyawen 已提交
1276 1277 1278

设置当前路径为剪切路径。

H
geshi  
HelloCrease 已提交
1279 1280
**示例:** 
  ```html
Z
zengyawen 已提交
1281 1282 1283 1284 1285 1286
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1287
  ```js
Z
zengyawen 已提交
1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.rect(0, 0, 200, 200);
      ctx.stroke();
      ctx.clip();
      // Draw red rectangle after clip
      ctx.fillStyle = "rgb(255,0,0)";
      ctx.fillRect(0, 0, 150, 150);
Z
zengyawen 已提交
1299
    }
Z
zengyawen 已提交
1300 1301
  }
  ```
Z
zengyawen 已提交
1302

Z
zengyawen 已提交
1303
  ![zh-cn_image_0000001169303414](figures/zh-cn_image_0000001169303414.png)
Z
zengyawen 已提交
1304

Z
zengyawen 已提交
1305
### rotate
Z
zengyawen 已提交
1306

Z
zengyawen 已提交
1307
rotate(rotate: number): void
Z
zengyawen 已提交
1308 1309 1310

针对当前坐标轴进行顺时针旋转。

H
geshi  
HelloCrease 已提交
1311
**参数:** 
B
bmeangel 已提交
1312

H
geshi  
HelloCrease 已提交
1313 1314 1315
| 参数     | 类型     | 描述                                       |
| ------ | ------ | ---------------------------------------- |
| rotate | number | 设置顺时针旋转的弧度值,可以通过Math.PI&nbsp;/&nbsp;180将角度转换为弧度值。 |
Z
zengyawen 已提交
1316

H
geshi  
HelloCrease 已提交
1317 1318
**示例:** 
  ```html
Z
zengyawen 已提交
1319 1320 1321 1322 1323 1324
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1325
  ```js
Z
zengyawen 已提交
1326 1327 1328 1329 1330 1331 1332
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.rotate(45 * Math.PI / 180); // Rotate the rectangle 45 degrees
      ctx.fillRect(70, 20, 50, 50);
Z
zengyawen 已提交
1333
    }
Z
zengyawen 已提交
1334 1335
  }
  ```
Z
zengyawen 已提交
1336

Z
zengyawen 已提交
1337
  ![zh-cn_image_0000001169463368](figures/zh-cn_image_0000001169463368.png)
Z
zengyawen 已提交
1338

Z
zengyawen 已提交
1339
### scale
Z
zengyawen 已提交
1340

Z
zengyawen 已提交
1341
scale(x: number, y: number): void
Z
zengyawen 已提交
1342 1343 1344

设置canvas画布的缩放变换属性,后续的绘制操作将按照缩放比例进行缩放。

H
geshi  
HelloCrease 已提交
1345
**参数:** 
B
bmeangel 已提交
1346

H
geshi  
HelloCrease 已提交
1347 1348 1349 1350
| 参数   | 类型     | 描述          |
| ---- | ------ | ----------- |
| x    | number | 设置水平方向的缩放值。 |
| y    | number | 设置垂直方向的缩放值。 |
Z
zengyawen 已提交
1351

H
geshi  
HelloCrease 已提交
1352 1353
**示例:** 
  ```html
Z
zengyawen 已提交
1354 1355 1356 1357 1358 1359
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1360
  ```js
Z
zengyawen 已提交
1361 1362 1363 1364 1365 1366 1367 1368
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.strokeRect(10, 10, 25, 25);
      ctx.scale(2, 2);// Scale to 200%
      ctx.strokeRect(10, 10, 25, 25);
Z
zengyawen 已提交
1369
    }
Z
zengyawen 已提交
1370 1371
  }
  ```
Z
zengyawen 已提交
1372

Z
zengyawen 已提交
1373
  ![zh-cn_image_0000001214463281](figures/zh-cn_image_0000001214463281.png)
Z
zengyawen 已提交
1374

Z
zengyawen 已提交
1375
### transform
Z
zengyawen 已提交
1376

Z
zengyawen 已提交
1377
transform(scaleX: number, skewX: number, skewY: number, scale: number, translateX: number, translateY: number): void
Z
zengyawen 已提交
1378 1379 1380

transform方法对应一个变换矩阵,想对一个图形进行变化的时候,只要设置此变换矩阵相应的参数,对图形的各个定点的坐标分别乘以这个矩阵,就能得到新的定点的坐标。矩阵变换效果可叠加。

H
geshi  
HelloCrease 已提交
1381 1382
>  **说明:**
>  变换后的坐标计算方式(x和y为变换前坐标,x'和y'为变换后坐标):
H
HelloCrease 已提交
1383
>
H
geshi  
HelloCrease 已提交
1384
>  - x' = scaleX \* x + skewY \* y + translateX
H
HelloCrease 已提交
1385
>
H
geshi  
HelloCrease 已提交
1386 1387 1388
>  - y' = skewX \* x + scaleY \* y + translateY

**参数:** 
B
bmeangel 已提交
1389

H
geshi  
HelloCrease 已提交
1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400
| 参数         | 类型     | 描述       |
| ---------- | ------ | -------- |
| scaleX     | number | 指定水平缩放值。 |
| skewX      | number | 指定水平倾斜值。 |
| skewY      | number | 指定垂直倾斜值。 |
| scaleY     | number | 指定垂直缩放值。 |
| translateX | number | 指定水平移动值。 |
| translateY | number | 指定垂直移动值。 |

**示例:** 
  ```html
Z
zengyawen 已提交
1401 1402 1403 1404 1405 1406
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1407
  ```js
Z
zengyawen 已提交
1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.fillStyle = 'rgb(0,0,0)';
      ctx.fillRect(0, 0, 100, 100)
      ctx.transform(1, 0.5, -0.5, 1, 10, 10);
      ctx.fillStyle = 'rgb(255,0,0)';
      ctx.fillRect(0, 0, 100, 100);
      ctx.transform(1, 0.5, -0.5, 1, 10, 10);
      ctx.fillStyle = 'rgb(0,0,255)';
      ctx.fillRect(0, 0, 100, 100);
Z
zengyawen 已提交
1421
    }
Z
zengyawen 已提交
1422 1423 1424 1425 1426 1427 1428 1429 1430
  }
  ```

  ![zh-cn_image_0000001214623227](figures/zh-cn_image_0000001214623227.png)

### setTransform

setTransform(scaleX: number, skewX: number, skewY: number, scale: number, translateX: number, translateY: number): void

1431
setTransform方法使用的参数和transform()方法相同,但setTransform()方法会重置现有的变换矩阵并创建新的变换矩阵。
Z
zengyawen 已提交
1432

H
geshi  
HelloCrease 已提交
1433
**参数:** 
B
bmeangel 已提交
1434

H
geshi  
HelloCrease 已提交
1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445
| 参数         | 类型     | 描述       |
| ---------- | ------ | -------- |
| scaleX     | number | 指定水平缩放值。 |
| skewX      | number | 指定水平倾斜值。 |
| skewY      | number | 指定垂直倾斜值。 |
| scaleY     | number | 指定垂直缩放值。 |
| translateX | number | 指定水平移动值。 |
| translateY | number | 指定垂直移动值。 |

**示例:** 
  ```html
Z
zengyawen 已提交
1446 1447 1448 1449 1450 1451
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1452
  ```js
Z
zengyawen 已提交
1453 1454 1455 1456 1457 1458 1459 1460 1461 1462
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.fillStyle = 'rgb(255,0,0)';
      ctx.fillRect(0, 0, 100, 100)
      ctx.setTransform(1,0.5, -0.5, 1, 10, 10);
      ctx.fillStyle = 'rgb(0,0,255)';
      ctx.fillRect(0, 0, 100, 100);
Z
zengyawen 已提交
1463
    }
Z
zengyawen 已提交
1464 1465
  }
  ```
Z
zengyawen 已提交
1466

Z
zengyawen 已提交
1467
  ![zh-cn_image_0000001168984880](figures/zh-cn_image_0000001168984880.png)
Z
zengyawen 已提交
1468

Z
zengyawen 已提交
1469
### translate
Z
zengyawen 已提交
1470

Z
zengyawen 已提交
1471
translate(x: number, y: number): void
Z
zengyawen 已提交
1472 1473 1474

移动当前坐标系的原点。

H
geshi  
HelloCrease 已提交
1475
**参数:** 
B
bmeangel 已提交
1476

H
geshi  
HelloCrease 已提交
1477 1478 1479 1480
| 参数   | 类型     | 描述       |
| ---- | ------ | -------- |
| x    | number | 设置水平平移量。 |
| y    | number | 设置竖直平移量。 |
Z
zengyawen 已提交
1481

H
geshi  
HelloCrease 已提交
1482 1483
**示例:** 
  ```html
Z
zengyawen 已提交
1484 1485 1486 1487 1488 1489
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1490
  ```js
Z
zengyawen 已提交
1491 1492 1493 1494 1495 1496 1497 1498
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.fillRect(10, 10, 50, 50);
      ctx.translate(70, 70);
      ctx.fillRect(10, 10, 50, 50);
Z
zengyawen 已提交
1499
    }
Z
zengyawen 已提交
1500 1501
  }
  ```
Z
zengyawen 已提交
1502

Z
zengyawen 已提交
1503
  ![zh-cn_image_0000001169144864](figures/zh-cn_image_0000001169144864.png)
Z
zengyawen 已提交
1504

Z
zengyawen 已提交
1505
### createPath2D<sup>6+</sup>
Z
zengyawen 已提交
1506

Z
zengyawen 已提交
1507
createPath2D(path: Path2D, cmds: string): Path2D
Z
zengyawen 已提交
1508 1509 1510

创建一个Path2D对象。

H
geshi  
HelloCrease 已提交
1511
**参数:** 
B
bmeangel 已提交
1512

H
geshi  
HelloCrease 已提交
1513 1514 1515 1516
| 参数   | 类型     | 描述             |
| ---- | ------ | -------------- |
| path | Path2D | Path2D对象。      |
| cmds | string | SVG的Path描述字符串。 |
Z
zengyawen 已提交
1517

B
bmeangel 已提交
1518 1519
**返回值:**

Z
zengyawen 已提交
1520 1521
  [Path2D对象](../arkui-js/js-components-canvas-path2d.md)

H
geshi  
HelloCrease 已提交
1522 1523
**示例:** 
  ```html
Z
zengyawen 已提交
1524 1525 1526 1527 1528 1529
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 500px; height: 500px; background-color: #ffff00;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1530
  ```js
Z
zengyawen 已提交
1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      var path1 = ctx.createPath2D();
      path1.moveTo(100, 100);
      path1.lineTo(200, 100);
      path1.lineTo(100, 200);
      path1.closePath();
      ctx.stroke(path1);
      var path2 = ctx.createPath2D("M150 150 L50 250 L250 250 Z");
      ctx.stroke(path2);
      var path3 = ctx.createPath2D(path2);
      ctx.stroke(path3);
Z
zengyawen 已提交
1546
    }
Z
zengyawen 已提交
1547 1548
  }
  ```
Z
zengyawen 已提交
1549

Z
zengyawen 已提交
1550
  ![zh-cn_image_0000001214824709](figures/zh-cn_image_0000001214824709.png)
Z
zengyawen 已提交
1551

Z
zengyawen 已提交
1552
### drawImage
Z
zengyawen 已提交
1553

Y
yaoyuchi 已提交
1554
drawImage(image: Image | PixelMap, sx: number, sy: number, sWidth: number, sHeight: number, dx: number, dy: number, dWidth: number, dHeight: number):void
Z
zengyawen 已提交
1555 1556 1557

进行图像绘制。

H
geshi  
HelloCrease 已提交
1558
**参数:** 
B
bmeangel 已提交
1559

H
geshi  
HelloCrease 已提交
1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573
| 参数      | 类型                             | 描述                                       |
| ------- | ------------------------------ | ---------------------------------------- |
| image   | Image \| PixelMap<sup>9+</sup> | 图片资源,请参考[Image对象](../arkui-js/js-components-canvas-image.md)[PixelMap对象](../apis/js-apis-image.md#pixelmap7)。 |
| sx      | number                         | 裁切源图像时距离源图像左上角的x坐标值。                     |
| sy      | number                         | 裁切源图像时距离源图像左上角的y坐标值。                     |
| sWidth  | number                         | 裁切源图像时需要裁切的宽度。                           |
| sHeight | number                         | 裁切源图像时需要裁切的高度。                           |
| dx      | number                         | 绘制区域左上角在x轴的位置。                           |
| dy      | number                         | 绘制区域左上角在y&nbsp;轴的位置。                     |
| dWidth  | number                         | 绘制区域的宽度。                                 |
| dHeight | number                         | 绘制区域的高度。                                 |

**示例:** 
  ```html
Z
zengyawen 已提交
1574 1575 1576 1577 1578 1579
  <!-- xxx.hml -->
  <div>
    <canvas style="width: 200px; height: 150px; background-color: #ffff00;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1580
  ```js
Z
zengyawen 已提交
1581 1582 1583 1584 1585 1586 1587 1588
  //xxx.js
  export default {
    onShow() {
      var test = this.$element('drawImage');
      var ctx = test.getContext('2d');
      var img = new Image();
      img.src = 'common/image/test.jpg';
      ctx.drawImage(img, 50, 80, 80, 80);
Z
zengyawen 已提交
1589
    }
Z
zengyawen 已提交
1590 1591
  }
  ```
Z
zengyawen 已提交
1592

Z
zengyawen 已提交
1593
  ![zh-cn_image_0000001214704759](figures/zh-cn_image_0000001214704759.png)
Z
zengyawen 已提交
1594

Z
zengyawen 已提交
1595
### restore
Z
zengyawen 已提交
1596

Z
zengyawen 已提交
1597
restore(): void
Z
zengyawen 已提交
1598 1599 1600

对保存的绘图上下文进行恢复。

H
geshi  
HelloCrease 已提交
1601 1602
**示例:** 
  ```html
Z
zengyawen 已提交
1603 1604 1605 1606 1607 1608
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; background-color: #ffff00;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1609
  ```js
Z
zengyawen 已提交
1610 1611 1612 1613 1614 1615
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.restore();
Z
zengyawen 已提交
1616
    }
Z
zengyawen 已提交
1617 1618
  }
  ```
Z
zengyawen 已提交
1619

Z
zengyawen 已提交
1620
### save
Z
zengyawen 已提交
1621

Z
zengyawen 已提交
1622
save(): void
Z
zengyawen 已提交
1623 1624 1625

对当前的绘图上下文进行保存。

H
geshi  
HelloCrease 已提交
1626 1627
**示例:** 
  ```html
Z
zengyawen 已提交
1628 1629 1630 1631 1632 1633
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; background-color: #ffff00;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1634
  ```js
Z
zengyawen 已提交
1635 1636 1637 1638 1639 1640
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.save();
Z
zengyawen 已提交
1641
    }
Z
zengyawen 已提交
1642 1643 1644 1645 1646 1647 1648 1649 1650
  }
  ```

### createLinearGradient<sup>6+</sup>

createLinearGradient(x0: number, y0: number, x1: number, y1: number): Object

创建一个线性渐变色,返回CanvasGradient对象,请参考[CanvasGradient对象](../arkui-js/js-components-canvas-canvasgradient.md)

H
geshi  
HelloCrease 已提交
1651
**参数:** 
B
bmeangel 已提交
1652

H
geshi  
HelloCrease 已提交
1653 1654 1655 1656 1657 1658 1659 1660
| 参数   | 类型     | 描述       |
| ---- | ------ | -------- |
| x0   | number | 起点的x轴坐标。 |
| y0   | number | 起点的y轴坐标。 |
| x1   | number | 终点的x轴坐标。 |
| y1   | number | 终点的y轴坐标。 |

**返回值:** 
B
bmeangel 已提交
1661

H
geshi  
HelloCrease 已提交
1662 1663 1664 1665 1666 1667
| 类型     | 说明                     |
| ------ | ---------------------- |
| Object | 返回创建的CanvasGradient对象。 |

**示例:** 
  ```html
Z
zengyawen 已提交
1668 1669 1670 1671 1672 1673 1674
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 500px; height: 500px; background-color: #ffff00;"></canvas>
    <input type="button" style="width: 180px; height: 60px;" value="fillStyle" onclick="handleClick" />
  </div>
  ```

H
geshi  
HelloCrease 已提交
1675
  ```js
Z
zengyawen 已提交
1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689
  // xxx.js
  export default {
    handleClick() {
      const el = this.$refs.canvas;
      const ctx = el.getContext('2d');
      // Linear gradient: start(50,0) end(300,100)
      var gradient = ctx.createLinearGradient(50,0, 300,100);
      // Add three color stops
      gradient.addColorStop(0.0, 'red');
      gradient.addColorStop(0.5, 'white');
      gradient.addColorStop(1.0, 'green');
      // Set the fill style and draw a rectangle
      ctx.fillStyle = gradient;
      ctx.fillRect(0, 0, 500, 500);
Z
zengyawen 已提交
1690
    }
Z
zengyawen 已提交
1691 1692
  }
  ```
Z
zengyawen 已提交
1693

Z
zengyawen 已提交
1694
  ![zh-cn_image_0000001169303416](figures/zh-cn_image_0000001169303416.png)
Z
zengyawen 已提交
1695

Z
zengyawen 已提交
1696
### createRadialGradient<sup>6+</sup>
Z
zengyawen 已提交
1697

Z
zengyawen 已提交
1698
createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): Object
Z
zengyawen 已提交
1699 1700 1701

创建一个径向渐变色,返回CanvasGradient对象,请参考CanvasGradient

H
geshi  
HelloCrease 已提交
1702
**参数:** 
B
bmeangel 已提交
1703

H
geshi  
HelloCrease 已提交
1704 1705 1706 1707 1708 1709 1710 1711 1712 1713
| 参数   | 类型     | 描述                |
| ---- | ------ | ----------------- |
| x0   | number | 起始圆的x轴坐标。         |
| y0   | number | 起始圆的y轴坐标。         |
| r0   | number | 起始圆的半径。必须是非负且有限的。 |
| x1   | number | 终点圆的x轴坐标。         |
| y1   | number | 终点圆的y轴坐标。         |
| r1   | number | 终点圆的半径。必须为非负且有限的。 |

**返回值:** 
B
bmeangel 已提交
1714

H
geshi  
HelloCrease 已提交
1715 1716 1717 1718 1719 1720
| 类型     | 说明                     |
| ------ | ---------------------- |
| Object | 返回创建的CanvasGradient对象。 |

**示例:** 
  ```html
Z
zengyawen 已提交
1721 1722 1723 1724 1725 1726 1727
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 500px; height: 500px; background-color: #ffff00;"></canvas>
    <input type="button" style="width: 180px; height: 60px;" value="fillStyle" onclick="handleClick" />
  </div>
  ```

H
geshi  
HelloCrease 已提交
1728
  ```js
Z
zengyawen 已提交
1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742
  // xxx.js
  export default {
    handleClick() {
      const el = this.$refs.canvas;
      const ctx = el.getContext('2d');
      // Radial gradient: inner circle(200,200,r:50) outer circle(200,200,r:200)
      var gradient = ctx.createRadialGradient(200,200,50, 200,200,200);
      // Add three color stops
      gradient.addColorStop(0.0, 'red');
      gradient.addColorStop(0.5, 'white');
      gradient.addColorStop(1.0, 'green');
      // Set the fill style and draw a rectangle
      ctx.fillStyle = gradient;
      ctx.fillRect(0, 0, 500, 500);
Z
zengyawen 已提交
1743
    }
Z
zengyawen 已提交
1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754
  }
  ```

  ![zh-cn_image_0000001169463370](figures/zh-cn_image_0000001169463370.png)

### createImageData

createImageData(width: number, height: number, imageData: Object): Object

创建新的ImageData 对象,请参考[ImageData对象](../arkui-js/js-components-canvas-imagedata.md)

H
geshi  
HelloCrease 已提交
1755
**参数:** 
B
bmeangel 已提交
1756

H
geshi  
HelloCrease 已提交
1757 1758 1759 1760 1761
| 参数        | 类型     | 描述                |
| --------- | ------ | ----------------- |
| width     | number | ImageData的宽度。     |
| height    | number | ImageData的高度。     |
| imagedata | Object | 复制现有的ImageData对象。 |
Z
zengyawen 已提交
1762

H
geshi  
HelloCrease 已提交
1763
**返回值:** 
B
bmeangel 已提交
1764

H
geshi  
HelloCrease 已提交
1765 1766 1767
| 类型     | 说明                |
| ------ | ----------------- |
| Object | 返回创建的ImageData对象。 |
Z
zengyawen 已提交
1768

H
geshi  
HelloCrease 已提交
1769 1770
**示例:** 
  ```html
Z
zengyawen 已提交
1771 1772 1773 1774 1775 1776
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; background-color: #ffff00;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1777
  ```js
Z
zengyawen 已提交
1778 1779 1780 1781 1782
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
W
wangshuainan1 已提交
1783 1784
      var imageData = ctx.createImageData(50, 100);  // Create ImageData with 50px width and 100px height
      var newImageData = ctx.createImageData(imageData);  // Create ImageData using the input imageData
Z
zengyawen 已提交
1785
    }
Z
zengyawen 已提交
1786 1787
  }
  ```
Z
zengyawen 已提交
1788

Z
zengyawen 已提交
1789
### getImageData
Z
zengyawen 已提交
1790

Z
zengyawen 已提交
1791
getImageData(sx: number, sy: number, sw: number, sh: number): Object
Z
zengyawen 已提交
1792 1793 1794

以当前canvas指定区域内的像素创建ImageData对象。

H
geshi  
HelloCrease 已提交
1795
**参数:** 
B
bmeangel 已提交
1796

H
geshi  
HelloCrease 已提交
1797 1798 1799 1800 1801 1802 1803 1804
| 参数   | 类型     | 描述              |
| ---- | ------ | --------------- |
| sx   | number | 需要输出的区域的左上角x坐标。 |
| sy   | number | 需要输出的区域的左上角y坐标。 |
| sw   | number | 需要输出的区域的宽度。     |
| sh   | number | 需要输出的区域的高度。     |

**返回值:** 
B
bmeangel 已提交
1805

H
geshi  
HelloCrease 已提交
1806 1807 1808 1809 1810 1811
| 类型     | 说明                      |
| ------ | ----------------------- |
| Object | 返回包含指定区域像素的ImageData对象。 |

**示例:** 
  ```html
Z
zengyawen 已提交
1812 1813
  <!-- xxx.hml -->
  <div>
G
gmy 已提交
1814
    <canvas id="getImageData" style="width: 200px; height: 150px; background-color: #ffff00;"></canvas>
Z
zengyawen 已提交
1815 1816 1817
  </div>
  ```

H
geshi  
HelloCrease 已提交
1818
  ```js
Z
zengyawen 已提交
1819 1820 1821
  //xxx.js
  export default {
    onShow() {
W
wangshuainan1 已提交
1822 1823
      const test = this.$element('getImageData')
      const ctx = test.getContext('2d');
Z
zengyawen 已提交
1824
      var imageData = ctx.getImageData(0, 0, 280, 300);
Z
zengyawen 已提交
1825
    }
Z
zengyawen 已提交
1826 1827
  }
  ```
Z
zengyawen 已提交
1828

Z
zengyawen 已提交
1829
### putImageData
Z
zengyawen 已提交
1830

Z
zengyawen 已提交
1831
putImageData(imageData: Object, dx: number, dy: number, dirtyX: number, dirtyY: number, dirtyWidth: number, dirtyHeight: number): void
Z
zengyawen 已提交
1832 1833 1834

使用ImageData数据填充新的矩形区域。

H
geshi  
HelloCrease 已提交
1835
**参数:** 
B
bmeangel 已提交
1836

H
geshi  
HelloCrease 已提交
1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848
| 参数          | 类型     | 描述                            |
| ----------- | ------ | ----------------------------- |
| imagedata   | Object | 包含像素值的ImageData对象。            |
| dx          | number | 填充区域在x轴方向的偏移量。                |
| dy          | number | 填充区域在y轴方向的偏移量。                |
| dirtyX      | number | 源图像数据矩形裁切范围左上角距离源图像左上角的x轴偏移量。 |
| dirtyY      | number | 源图像数据矩形裁切范围左上角距离源图像左上角的y轴偏移量。 |
| dirtyWidth  | number | 源图像数据矩形裁切范围的宽度。               |
| dirtyHeight | number | 源图像数据矩形裁切范围的高度。               |

**示例:** 
  ```html
Z
zengyawen 已提交
1849 1850
  <!-- xxx.hml -->
  <div>
G
gmy 已提交
1851
    <canvas id="getImageData" style="width: 200px; height: 150px; background-color: #ffff00;"></canvas>
Z
zengyawen 已提交
1852 1853 1854
  </div>
  ```

H
geshi  
HelloCrease 已提交
1855
  ```js
Z
zengyawen 已提交
1856 1857 1858
  //xxx.js
  export default {
    onShow() {
W
wangshuainan1 已提交
1859 1860
      const test = this.$element('getImageData')
      const ctx = test.getContext('2d');
Z
zengyawen 已提交
1861 1862 1863 1864 1865 1866
      var imgData = ctx.createImageData(100, 100);
      for (var i = 0; i < imgData.data.length; i += 4) {
        imgData.data[i + 0] = 255;
        imgData.data[i + 1] = 0;
        imgData.data[i + 2] = 0;
        imgData.data[i + 3] = 255;
Z
zengyawen 已提交
1867
    }
Z
zengyawen 已提交
1868 1869 1870 1871
      ctx.putImageData(imgData, 10, 10);
    }
  }
  ```
Z
zengyawen 已提交
1872

Z
zengyawen 已提交
1873
  ![zh-cn_image_0000001214463283](figures/zh-cn_image_0000001214463283.png)
Z
zengyawen 已提交
1874

Y
yaoyuchi 已提交
1875
### getPixelMap<sup>9+</sup>
Y
yaoyuchi 已提交
1876 1877 1878

getPixelMap(sx: number, sy: number, sw: number, sh: number): PixelMap

Y
yaoyuchi 已提交
1879
获取用当前canvas指定区域内的像素创建的PixelMap对象。
Y
yaoyuchi 已提交
1880

H
geshi  
HelloCrease 已提交
1881
**参数:** 
Y
yaoyuchi 已提交
1882

H
geshi  
HelloCrease 已提交
1883 1884 1885 1886 1887 1888
| 参数   | 类型     | 描述           |
| ---- | ------ | ------------ |
| sx   | number | 指定区域的左上角x坐标。 |
| sy   | number | 指定区域的左上角y坐标。 |
| sw   | number | 指定区域的宽度。     |
| sh   | number | 指定区域的高度。     |
Y
yaoyuchi 已提交
1889

H
geshi  
HelloCrease 已提交
1890
**返回值:** 
Y
yaoyuchi 已提交
1891

H
geshi  
HelloCrease 已提交
1892 1893 1894
| 类型                                       | 说明                     |
| ---------------------------------------- | ---------------------- |
| [PixelMap](../apis/js-apis-image.md#pixelmap7) | 返回包含指定区域像素的PixelMap对象。 |
Y
yaoyuchi 已提交
1895

H
geshi  
HelloCrease 已提交
1896
**示例:** 
Y
yaoyuchi 已提交
1897

H
geshi  
HelloCrease 已提交
1898
  ```html
Y
yaoyuchi 已提交
1899 1900
  <!-- xxx.hml -->
  <div>
Y
yaoyuchi 已提交
1901
    <canvas id="canvasId" style="width: 200px; height: 150px; background-color: #ffff00;"></canvas>
Y
yaoyuchi 已提交
1902 1903 1904
  </div>
  ```

H
geshi  
HelloCrease 已提交
1905
  ```js
Y
yaoyuchi 已提交
1906 1907 1908 1909 1910 1911 1912 1913 1914 1915
  //xxx.js
  export default {
    onShow() {
      const test = this.$element('canvasId')
      const ctx = test.getContext('2d');
      var pixelMap = ctx.getPixelMap(0, 0, 280, 300);
    }
  }
  ```

Z
zengyawen 已提交
1916
### setLineDash
Z
zengyawen 已提交
1917

Z
zengyawen 已提交
1918
setLineDash(segments: Array): void
Z
zengyawen 已提交
1919 1920 1921

设置画布的虚线样式。

H
geshi  
HelloCrease 已提交
1922
**参数:** 
B
bmeangel 已提交
1923

H
geshi  
HelloCrease 已提交
1924 1925 1926
| 参数       | 类型    | 描述                   |
| -------- | ----- | -------------------- |
| segments | Array | 作为数组用来描述线段如何交替和间距长度。 |
Z
zengyawen 已提交
1927

H
geshi  
HelloCrease 已提交
1928 1929
**示例:** 
  ```html
Z
zengyawen 已提交
1930 1931 1932 1933 1934 1935
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; background-color: #ffff00;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1936
  ```js
Z
zengyawen 已提交
1937 1938 1939 1940 1941 1942 1943 1944
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      ctx.arc(100, 75, 50, 0, 6.28);
      ctx.setLineDash([10,20]);
      ctx.stroke();
Z
zengyawen 已提交
1945
    }
Z
zengyawen 已提交
1946 1947
  }
  ```
Z
zengyawen 已提交
1948

Z
zengyawen 已提交
1949
  ![zh-cn_image_0000001214623229](figures/zh-cn_image_0000001214623229.png)
Z
zengyawen 已提交
1950

Z
zengyawen 已提交
1951
### getLineDash
Z
zengyawen 已提交
1952

Z
zengyawen 已提交
1953
getLineDash(): Array
Z
zengyawen 已提交
1954 1955 1956

获得当前画布的虚线样式。

H
geshi  
HelloCrease 已提交
1957
**返回值:** 
B
bmeangel 已提交
1958

H
geshi  
HelloCrease 已提交
1959 1960 1961
| 类型    | 说明                       |
| ----- | ------------------------ |
| Array | 返回数组,该数组用来描述线段如何交替和间距长度。 |
Z
zengyawen 已提交
1962

H
geshi  
HelloCrease 已提交
1963 1964
**示例:** 
  ```html
Z
zengyawen 已提交
1965 1966 1967 1968 1969 1970
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 200px; height: 150px; "></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
1971
  ```js
Z
zengyawen 已提交
1972 1973 1974 1975 1976 1977
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      var info = ctx.getLineDash();
Z
zengyawen 已提交
1978
    }
Z
zengyawen 已提交
1979 1980
  }
  ```
Z
zengyawen 已提交
1981

Z
zengyawen 已提交
1982
### transferFromImageBitmap<sup>7+</sup>
Z
zengyawen 已提交
1983

Z
zengyawen 已提交
1984
transferFromImageBitmap(bitmap: ImageBitmap): void
Z
zengyawen 已提交
1985 1986 1987

显示给定的ImageBitmap对象。

H
geshi  
HelloCrease 已提交
1988
**参数:** 
B
bmeangel 已提交
1989

H
geshi  
HelloCrease 已提交
1990 1991 1992
| 参数     | 类型          | 描述                 |
| ------ | ----------- | ------------------ |
| bitmap | ImageBitmap | 待显示的ImageBitmap对象。 |
Z
zengyawen 已提交
1993

H
geshi  
HelloCrease 已提交
1994 1995
**示例:** 
  ```html
Z
zengyawen 已提交
1996 1997 1998 1999 2000 2001
  <!-- xxx.hml -->
  <div>
    <canvas ref="canvas" style="width: 500px; height: 500px; background-color: #ffff00;"></canvas>
  </div>
  ```

H
geshi  
HelloCrease 已提交
2002
  ```js
Z
zengyawen 已提交
2003 2004 2005 2006 2007 2008 2009 2010 2011
  //xxx.js
  export default {
    onShow() {
      const el =this.$refs.canvas;
      const ctx = el.getContext('2d');
      var canvas = this.$refs.canvas.getContext('2d');
      var offscreen = new OffscreenCanvas(500,500);
      var offscreenCanvasCtx = offscreen.getContext("2d");
      offscreenCanvasCtx.fillRect(0, 0, 200, 200); 
W
wangshuainan1 已提交
2012

Z
zengyawen 已提交
2013 2014
      var bitmap = offscreen.transferToImageBitmap();
      canvas.transferFromImageBitmap(bitmap);
Z
zengyawen 已提交
2015
    }
Z
zengyawen 已提交
2016 2017
  }
  ```
Z
zengyawen 已提交
2018

Y
yaoyuchi 已提交
2019
  ![zh-cn_image_0000001168984882](figures/zh-cn_image_0000001168984882.png)