• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# OffscreenCanvasRenderingContext2D对象
2<!--Kit: ArkUI-->
3<!--Subsystem: ArkUI-->
4<!--Owner: @sd-wu-->
5<!--Designer: @sunbees-->
6<!--Tester: @liuli0427-->
7<!--Adviser: @HelloCrease-->
8
9>  **说明:**
10>  从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
11
12
13使用OffscreenCanvasRenderingContext2D在[OffscreenCanvas对象](js-components-canvas-offscreencanvas.md)上进行绘制,绘制对象可以是矩形、文本、图片等。
14
15
16## 属性
17
18除支持与[CanvasRenderingContext2D对象](js-components-canvas-canvasrenderingcontext2d.md)相同的属性外,还支持如下属性:
19
20| 属性     | 类型     | 描述                                       |
21| ------ | ------ | ---------------------------------------- |
22| filter | string | 设置图像的滤镜。<br/>支持的滤镜效果如下:<br/>-&nbsp;blur:给图像设置高斯模糊。<br/>-&nbsp;brightness:给图片应用一种线性乘法,使其看起来更亮或更暗。<br/>-&nbsp;contrast:调整图像的对比度。<br/>-&nbsp;drop-shadow:给图像设置一个阴影效果。<br/>-&nbsp;grayscale:将图像转换为灰度图像。<br/>-&nbsp;hue-rotate:给图像应用色相旋转。<br/>-&nbsp;invert:反转输入图像。<br/>-&nbsp;opacity:转化图像的透明程度。<br/>-&nbsp;saturate:转换图像饱和度。<br/>-&nbsp;sepia:将图像转换为深褐色。 |
23
24**示例:**
25```html
26<!-- xxx.hml -->
27<div style="width: 500px; height: 500px;">
28  <canvas ref="canvasId" style="width: 500px; height: 500px; background-color: #ffff00;"></canvas>
29</div>
30```
31
32```js
33// xxx.js
34export default {
35  onShow(){
36    var ctx = this.$refs.canvasId.getContext('2d');
37    var offscreen = new OffscreenCanvas(360, 500);
38    var offCanvas2 = offscreen.getContext("2d");
39    var img = new Image();
40    // 'common/images/flower.jpg'需要替换为开发者所需的图像资源文件
41    img.src = 'common/images/flower.jpg';
42    offCanvas2.drawImage(img, 0, 0, 100, 100);
43    offCanvas2.filter = 'blur(5px)';
44    offCanvas2.drawImage(img, 100, 0, 100, 100);
45
46    offCanvas2.filter = 'grayscale(50%)';
47    offCanvas2.drawImage(img, 200, 0, 100, 100);
48
49    offCanvas2.filter = 'hue-rotate(90deg)';
50    offCanvas2.drawImage(img, 0, 100, 100, 100);
51
52    offCanvas2.filter = 'invert(100%)';
53    offCanvas2.drawImage(img, 100, 100, 100, 100);
54
55    offCanvas2.filter = 'drop-shadow(8px 8px 10px green)';
56    offCanvas2.drawImage(img, 200, 100, 100, 100);
57
58    offCanvas2.filter = 'brightness(0.4)';
59    offCanvas2.drawImage(img, 0, 200, 100, 100);
60
61    offCanvas2.filter = 'opacity(25%)';
62    offCanvas2.drawImage(img, 100, 200, 100, 100);
63
64    offCanvas2.filter = 'saturate(30%)';
65    offCanvas2.drawImage(img, 200, 200, 100, 100);
66
67    offCanvas2.filter = 'sepia(60%)';
68    offCanvas2.drawImage(img, 0, 300, 100, 100);
69
70    offCanvas2.filter = 'contrast(200%)';
71    offCanvas2.drawImage(img, 100, 300, 100, 100);
72    var bitmap = offscreen.transferToImageBitmap();
73    ctx.transferFromImageBitmap(bitmap);
74  }
75}
76```
77
78## 方法
79
80除支持与CanvasRenderingContext2D对象相同的方法外,还支持如下方法:
81
82
83### isPointInPath
84
85isPointInPath(path?: Path2D, x: number, y: number): boolean
86
87判断指定点是否在路径的区域内。
88
89**参数:**
90| 参数名  | 参数类型   | 必填   | 描述                            |
91| ---- | ------ | ---- | ----------------------------- |
92| path | Path2D | 否    | 可选对象,指定用来判断的路径。若没有设置,则使用当前路径。 |
93| x    | number | 是    | 待判断点的x轴坐标。                    |
94| y    | number | 是    | 待判断点的y轴坐标。                    |
95
96**返回值:**
97| 类型      | 说明            |
98| ------- | ------------- |
99| boolean | 指定点是否在路径的区域内。返回true时,指定点在路径区域内。返回false时,指定点不在路径路径区域内。 |
100
101**示例:**
102```html
103<!-- xxx.hml -->
104<div class="container" style="width: 500px; height: 500px;">
105    <text class="textsize">In path:{{textValue}}</text>
106    <canvas ref="canvas" style="width: 500px; height: 500px; background-color: #ffff00;"></canvas>
107</div>
108```
109
110```css
111/* xxx.css */
112.container {
113    display: flex;
114    flex-direction: column;
115    background-color: #F1F3F5;
116    align-items: center;
117    justify-content: center;
118    width: 100%;
119    height: 100%;
120}
121
122canvas {
123    width: 600px;
124    height: 600px;
125    background-color: #fdfdfd;
126    border: none;
127}
128
129.textsize {
130    font-size: 40px;
131}
132```
133
134```js
135// xxx.js
136export default {
137  data: {
138    textValue: false
139  },
140  onShow(){
141    var canvas = this.$refs.canvas.getContext('2d');
142    var offscreen = new OffscreenCanvas(500,500);
143    var offscreenCanvasCtx = offscreen.getContext("2d");
144
145    offscreenCanvasCtx.rect(10, 10, 100, 100);
146    offscreenCanvasCtx.fill();
147    this.textValue = offscreenCanvasCtx.isPointInPath(30, 70);
148
149    var bitmap = offscreen.transferToImageBitmap();
150    canvas.transferFromImageBitmap(bitmap);
151  }
152}
153```
154
155![zh-cn_image_0000001224354967](figures/zh-cn_image_0000001224354967.png)
156
157### isPointInStroke
158
159isPointInStroke(path?: Path2D, x: number, y: number): boolean
160
161判断指定点是否在路径的边缘线上。
162
163**参数:**
164| 参数名  | 参数类型   | 必填   | 描述                            |
165| ---- | ------ | ---- | ----------------------------- |
166| path | Path2D | 否    | 可选对象,指定用来判断的路径。若没有设置,则使用当前路径。 |
167| x    | number | 是    | 待判断点的x轴坐标。                    |
168| y    | number | 是    | 待判断点的y轴坐标。                    |
169
170**返回值:**
171| 类型      | 说明            |
172| ------- | ------------- |
173| boolean | 指定点是否在路径的区域内。 |
174
175**示例:**
176```html
177<!-- xxx.hml -->
178<div class="container" style="width: 500px; height: 500px;">
179    <text class="textsize">In stroke:{{textValue}}</text>
180    <canvas ref="canvas" style="width: 500px; height: 500px; background-color: #ffff00;"></canvas>
181</div>
182```
183
184```css
185/* xxx.css */
186.container {
187    display: flex;
188    flex-direction: column;
189    background-color: #F1F3F5;
190    align-items: center;
191    justify-content: center;
192    width: 100%;
193    height: 100%;
194}
195
196canvas {
197    width: 600px;
198    height: 600px;
199    background-color: #fdfdfd;
200    border: none;
201}
202
203.textsize {
204    font-size: 40px;
205}
206```
207
208```js
209// xxx.js
210export default {
211  data: {
212    textValue: false
213  },
214  onShow(){
215    var canvas = this.$refs.canvas.getContext('2d');
216    var offscreen = new OffscreenCanvas(500,500);
217    var offscreenCanvasCtx = offscreen.getContext("2d");
218
219    offscreenCanvasCtx.rect(10, 10, 100, 100);
220    offscreenCanvasCtx.stroke();
221    this.textValue = offscreenCanvasCtx.isPointInStroke(50, 10);
222
223    var bitmap = offscreen.transferToImageBitmap();
224    canvas.transferFromImageBitmap(bitmap);
225  }
226}
227```
228
229![zh-cn_image_0000001178875308](figures/zh-cn_image_0000001178875308.png)
230
231### resetTransform
232
233resetTransform(): void
234
235**示例:**
236```html
237<!-- xxx.hml -->
238<div class="container" style="width: 500px; height: 500px;">
239    <text class="textsize">In path:{{textValue}}</text>
240    <canvas ref="canvas" style="width: 500px; height: 500px; background-color: #ffff00;"></canvas>
241</div>
242```
243
244```css
245/* xxx.css */
246.container {
247    display: flex;
248    flex-direction: column;
249    background-color: #F1F3F5;
250    align-items: center;
251    justify-content: center;
252    width: 100%;
253    height: 100%;
254}
255
256canvas {
257    width: 600px;
258    height: 600px;
259    background-color: #fdfdfd;
260    border: none;
261}
262
263.textsize {
264    font-size: 40px;
265}
266```
267
268```js
269// xxx.js
270export default {
271  data:{
272   textValue:0
273  },
274  onShow(){
275   var canvas = this.$refs.canvas.getContext('2d');
276   var offscreen = new OffscreenCanvas(500,500);
277   var offscreenCanvasCtx = offscreen.getContext("2d");
278
279   offscreenCanvasCtx.transform(1, 0, 1.7, 1, 0, 0);
280   offscreenCanvasCtx.fillStyle = '#a9a9a9';
281   offscreenCanvasCtx.fillRect(40, 40, 50, 20);
282   offscreenCanvasCtx.fillRect(40, 90, 50, 20);
283
284   // Non-skewed rectangles
285   offscreenCanvasCtx.resetTransform();
286   offscreenCanvasCtx.fillStyle = '#ff0000';
287   offscreenCanvasCtx.fillRect(40, 40, 50, 20);
288   offscreenCanvasCtx.fillRect(40, 90, 50, 20);
289
290   var bitmap = offscreen.transferToImageBitmap();
291   canvas.transferFromImageBitmap(bitmap);
292  }
293}
294```
295
296![zh-cn_image_0000001179035242](figures/zh-cn_image_0000001179035242.png)