canvas.md 3.4 KB
Newer Older
D
DCloud_LXH 已提交
1 2 3 4
## canvas

<!-- UTSCOMJSON.canvas.description -->

D
DCloud_LXH 已提交
5 6
<!-- UTSCOMJSON.canvas.compatibility -->

7
App平台4.25之前没有完整的canvas组件,但
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
8 9 10 11 12 13 14 15
* 每个view,都提供了[draw API](../dom/drawablecontext.md),可以高性能的画各种形状、写字。这组API与web的canvas api接近但不同。
* 截图或海报需求,无需像webview那样通过canvas中转,app平台view直接提供截图API,[takesnapshot](../dom/element.md#takesnapshot)
* 使用web-view中的canvas也是一种方案,uvue页面里的web-view组件可以和uvue页面里的uts代码双向通信。
* 二维码展示需求:[见插件市场](https://ext.dcloud.net.cn/search?q=%E4%BA%8C%E7%BB%B4%E7%A0%81&uni-appx=1)
* 图表需求:[插件市场搜echart](https://ext.dcloud.net.cn/search?q=chart&orderBy=Relevance&uni-appx=1)[插件市场搜F2](https://ext.dcloud.net.cn/search?q=f2&orderBy=Relevance&uni-appx=1)
* 手写签名:[见插件市场](https://ext.dcloud.net.cn/search?q=%E7%AD%BE%E5%90%8D&orderBy=Relevance&uni-appx=1)
* 后期App平台也会补充正式的canvas组件

16
<!-- UTSCOMJSON.canvas.attribute -->
D
DCloud_LXH 已提交
17 18 19

<!-- UTSCOMJSON.canvas.event -->

20 21
<!-- UTSCOMJSON.canvas.component_type-->

D
DCloud_LXH 已提交
22 23
<!-- UTSCOMJSON.canvas.children -->

24 25
<!-- UTSCOMJSON.canvas.example -->

D
DCloud_LXH 已提交
26
<!-- UTSCOMJSON.canvas.reference -->
27 28 29 30 31

## API

和 W3C 规范保持一致 [https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/canvas](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/canvas)

H
hdx 已提交
32 33
4.23+ 开始支持 canvas.toDataURL(), 详情[https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement/toDataURL](https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement/toDataURL)

H
hdx 已提交
34
## 注意事项@tips
35

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
36
老版 uni-app 的 canvas 使用了微信小程序的的旧版规范,和 W3C 规范有差异。微信小程序新版的 canvas 规范已经与 W3C 规范拉齐。
H
hdx 已提交
37

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
38
uni-app x 中废弃了老版方案,使用了 W3C 规范和微信小程序的新版规范。
H
hdx 已提交
39

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
40 41 42
注意:在uni-app x 4.21版以前,开发者写的老版canvas是可以运行的。但从 4.21+ 支持新版规范起,不再支持老版规范。开发者需调整代码。

注意:新版规范需要开发者根据自己的场景手动处理高清屏问题。
43

44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
**异步方式**

```html
<template>
  <canvas id="canvas"></canvas>
</template>
<script setup>
// HBuilderX 4.25
// 异步调用方式, 跨平台写法
uni.createCanvasContextAsync({
  id: 'canvas',
  component: this,
  success: (context : CanvasContext) => {
    const canvasContext = context.getContext('2d')!;
    const canvas = canvasContext.canvas;

    // 处理高清屏逻辑
    const dpr = uni.getDeviceInfo().devicePixelRatio ?? 1;
    canvas.width = canvas.offsetWidth * dpr;
    canvas.height = canvas.offsetHeight * dpr;
    canvasContext.scale(dpr, dpr); // 仅需调用一次,当调用 reset 方法后需要再次 scale
  }
})
</script>
```

**同步方式**

72
```html
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
73 74
<template>
  <canvas id="canvas"></canvas>
75 76
</template>
<script setup>
77
// 同步调用方式,仅支持 app/web
78 79 80 81
const canvas = uni.getElementById("canvas") as UniCanvasElement
const context = canvas.getContext("2d")!;

// 处理高清屏逻辑
82
const dpr = uni.getDeviceInfo().devicePixelRatio ?? 1;
83 84 85 86 87 88 89
canvas.width = canvas.offsetWidth * dpr;
canvas.height = canvas.offsetHeight * dpr;
context.scale(dpr, dpr); // 仅需调用一次,当调用 reset 方法后需要再次 scale

// 省略绘制代码,和 w3c 规范保持一致
</script>
```