vislite 1.10.0 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG +6 -0
- package/README-en.md +249 -0
- package/README.md +2 -0
- package/lib/BarLayout/index.es.js +38 -9
- package/lib/BarLayout/index.es.min.js +1 -1
- package/lib/PieLayout/index.es.js +38 -9
- package/lib/PieLayout/index.es.min.js +1 -1
- package/lib/TreeLayout/index.es.js +38 -9
- package/lib/TreeLayout/index.es.min.js +1 -1
- package/lib/animation/index.es.js +38 -9
- package/lib/animation/index.es.min.js +1 -1
- package/lib/index.umd.js +39 -10
- package/lib/index.umd.min.js +2 -2
- package/package.json +3 -3
- package/skills/vislite-lib/BarLayout.md +118 -0
- package/skills/vislite-lib/Canvas.md +184 -0
- package/skills/vislite-lib/Interpolation.md +130 -0
- package/skills/vislite-lib/Matrix.md +175 -0
- package/skills/vislite-lib/PieLayout.md +132 -0
- package/skills/vislite-lib/Projections.md +159 -0
- package/skills/vislite-lib/SKILL.md +176 -0
- package/skills/vislite-lib/SVG.md +138 -0
- package/skills/vislite-lib/TreeLayout.md +177 -0
- package/skills/vislite-lib/Utilities.md +177 -0
- package/skills/vislite-lib/WebGL.md +107 -0
- package/skills/vislite-lib/minialipay/ui-canvas.md +96 -0
- package/skills/vislite-lib/miniprogram/ui-canvas.md +99 -0
- package/skills/vislite-lib/uniapp/ui-canvas.md +114 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# 工具函数 API
|
|
2
|
+
|
|
3
|
+
VISLite 提供多种实用的工具函数。
|
|
4
|
+
|
|
5
|
+
## ruler 刻度尺算法
|
|
6
|
+
|
|
7
|
+
根据数值范围计算合适的刻度尺刻度。
|
|
8
|
+
|
|
9
|
+
### 引入
|
|
10
|
+
|
|
11
|
+
```js
|
|
12
|
+
import { ruler } from 'vislite';
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### 使用方法
|
|
16
|
+
|
|
17
|
+
```js
|
|
18
|
+
var scales = ruler(maxValue, minValue, num);
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### 参数说明
|
|
22
|
+
|
|
23
|
+
- **maxValue**: 最大值
|
|
24
|
+
- **minValue**: 最小值
|
|
25
|
+
- **num**: 刻度数量(建议值)
|
|
26
|
+
|
|
27
|
+
### 返回值
|
|
28
|
+
|
|
29
|
+
返回刻度数组,例如 `[0, 20, 40, 60, 80, 100]`
|
|
30
|
+
|
|
31
|
+
### 示例
|
|
32
|
+
|
|
33
|
+
```js
|
|
34
|
+
var scales = ruler(85, 12, 5);
|
|
35
|
+
console.log(scales); // 可能输出 [0, 20, 40, 60, 80, 100]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## animation 动画控制
|
|
41
|
+
|
|
42
|
+
提供基于requestAnimationFrame的动画控制。
|
|
43
|
+
|
|
44
|
+
### 引入
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
import { animation } from 'vislite';
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 使用方法
|
|
51
|
+
|
|
52
|
+
```js
|
|
53
|
+
var stop = animation(function(percent) {
|
|
54
|
+
// percent: 0-1 的动画进度
|
|
55
|
+
var x = startX + (endX - startX) * percent;
|
|
56
|
+
// 更新绘制...
|
|
57
|
+
}, duration, function() {
|
|
58
|
+
// 动画结束回调
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 返回值
|
|
63
|
+
|
|
64
|
+
`stop` 函数,调用可停止动画。
|
|
65
|
+
|
|
66
|
+
### 示例
|
|
67
|
+
|
|
68
|
+
```js
|
|
69
|
+
var stop = animation(function(percent) {
|
|
70
|
+
var x = 0 + (200 - 0) * percent;
|
|
71
|
+
painter.clearRect(0, 0, 300, 300);
|
|
72
|
+
painter.fillCircle(x, 100, 20);
|
|
73
|
+
}, 1000, function() {
|
|
74
|
+
console.log('动画结束');
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// 1秒后停止
|
|
78
|
+
setTimeout(stop, 1000);
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## getLoopColors 循环颜色
|
|
84
|
+
|
|
85
|
+
生成一组循环使用的颜色数组。
|
|
86
|
+
|
|
87
|
+
### 引入
|
|
88
|
+
|
|
89
|
+
```js
|
|
90
|
+
import { getLoopColors } from 'vislite';
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 使用方法
|
|
94
|
+
|
|
95
|
+
```js
|
|
96
|
+
var colors = getLoopColors(num, alpha, colorsFactory);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 参数说明
|
|
100
|
+
|
|
101
|
+
- **num**: 需要的颜色数量
|
|
102
|
+
- **alpha**: 透明度(0-1),默认 1
|
|
103
|
+
- **colorsFactory**: 自定义颜色工厂函数
|
|
104
|
+
|
|
105
|
+
### 返回值
|
|
106
|
+
|
|
107
|
+
返回颜色数组,例如 `['rgba(84,112,198,1)', 'rgba(145,204,117,1)', ...]`
|
|
108
|
+
|
|
109
|
+
### 示例
|
|
110
|
+
|
|
111
|
+
```js
|
|
112
|
+
// 获取10个颜色
|
|
113
|
+
var colors = getLoopColors(10);
|
|
114
|
+
|
|
115
|
+
// 获取半透明颜色
|
|
116
|
+
var colors = getLoopColors(10, 0.5);
|
|
117
|
+
|
|
118
|
+
// 自定义颜色
|
|
119
|
+
var colors = getLoopColors(5, 1, function(alpha) {
|
|
120
|
+
return [
|
|
121
|
+
'rgba(255,0,0,' + alpha + ')',
|
|
122
|
+
'rgba(0,255,0,' + alpha + ')'
|
|
123
|
+
];
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## throttle 节流函数
|
|
130
|
+
|
|
131
|
+
限制函数执行频率。
|
|
132
|
+
|
|
133
|
+
### 引入
|
|
134
|
+
|
|
135
|
+
```js
|
|
136
|
+
import { throttle } from 'vislite';
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 使用方法
|
|
140
|
+
|
|
141
|
+
```js
|
|
142
|
+
var throttleFunc = throttle(func, delay);
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 参数说明
|
|
146
|
+
|
|
147
|
+
- **func**: 要节流的函数
|
|
148
|
+
- **delay**: 延迟时间(毫秒)
|
|
149
|
+
|
|
150
|
+
### 返回值
|
|
151
|
+
|
|
152
|
+
返回节流后的函数。
|
|
153
|
+
|
|
154
|
+
### 示例
|
|
155
|
+
|
|
156
|
+
```js
|
|
157
|
+
// 滚动事件节流
|
|
158
|
+
var handleScroll = throttle(function() {
|
|
159
|
+
console.log('scrolling');
|
|
160
|
+
}, 100);
|
|
161
|
+
|
|
162
|
+
window.addEventListener('scroll', handleScroll);
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## assemble 颜色组装
|
|
168
|
+
|
|
169
|
+
内部使用的颜色组装工具,用于区域检测的颜色编码。
|
|
170
|
+
|
|
171
|
+
### 引入
|
|
172
|
+
|
|
173
|
+
```js
|
|
174
|
+
import { assemble } from 'vislite';
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
返回给定范围内的随机颜色值,用于 Canvas 区域检测功能。
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# WebGL API
|
|
2
|
+
|
|
3
|
+
WebGL 相关模块,用于 3D 图形渲染。**仅支持 H5 端**。
|
|
4
|
+
|
|
5
|
+
## 获取 WebGL 上下文
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
import { getWebGLContext } from 'vislite';
|
|
9
|
+
|
|
10
|
+
var canvas = document.getElementById('canvas');
|
|
11
|
+
var gl = getWebGLContext(canvas, scale, {
|
|
12
|
+
preserveDrawingBuffer: true
|
|
13
|
+
}, 'scaleToFill');
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### 参数说明
|
|
17
|
+
|
|
18
|
+
- **canvas**: HTMLCanvasElement
|
|
19
|
+
- **scale**: 缩放比例,默认1
|
|
20
|
+
- **opts**: 配置项
|
|
21
|
+
- `preserveDrawingBuffer`: 是否保留绘制缓冲区
|
|
22
|
+
- **mode**: 缩放模式
|
|
23
|
+
- `scaleToFill`: 拉伸填充
|
|
24
|
+
- `aspectFit`: 适应(保持比例)
|
|
25
|
+
- `aspectFill`: 覆盖(保持比例)
|
|
26
|
+
|
|
27
|
+
### 返回值
|
|
28
|
+
|
|
29
|
+
返回 `WebGL2RenderingContext` 对象。
|
|
30
|
+
|
|
31
|
+
## Shader (着色器)
|
|
32
|
+
|
|
33
|
+
```js
|
|
34
|
+
import { Shader } from 'vislite';
|
|
35
|
+
|
|
36
|
+
var shader = new Shader(gl, {
|
|
37
|
+
vertexShader: '...', // 顶点着色器源码
|
|
38
|
+
fragmentShader: '...' // 片元着色器源码
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
shader.use();
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 方法
|
|
45
|
+
|
|
46
|
+
- `use()`: 使用该着色器程序
|
|
47
|
+
- `setAttribute(name, data)`: 设置顶点属性
|
|
48
|
+
- `setUniform(name, type, value)`: 设置 uniform 变量
|
|
49
|
+
|
|
50
|
+
## Buffer (缓冲区)
|
|
51
|
+
|
|
52
|
+
```js
|
|
53
|
+
import { Buffer } from 'vislite';
|
|
54
|
+
|
|
55
|
+
var buffer = new Buffer(gl);
|
|
56
|
+
buffer.setAttribute('position', data);
|
|
57
|
+
buffer.bind();
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Texture (纹理)
|
|
61
|
+
|
|
62
|
+
```js
|
|
63
|
+
import { Texture } from 'vislite';
|
|
64
|
+
|
|
65
|
+
var texture = new Texture(gl);
|
|
66
|
+
texture.bind();
|
|
67
|
+
texture.setImage(image);
|
|
68
|
+
texture.setParameter(params);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 使用示例
|
|
72
|
+
|
|
73
|
+
```js
|
|
74
|
+
import { getWebGLContext, Shader, Buffer, Texture } from 'vislite';
|
|
75
|
+
|
|
76
|
+
var gl = getWebGLContext(canvas, 1);
|
|
77
|
+
|
|
78
|
+
// 创建着色器
|
|
79
|
+
var shader = new Shader(gl, {
|
|
80
|
+
vertexShader: `
|
|
81
|
+
attribute vec4 position;
|
|
82
|
+
void main() {
|
|
83
|
+
gl_Position = position;
|
|
84
|
+
}
|
|
85
|
+
`,
|
|
86
|
+
fragmentShader: `
|
|
87
|
+
precision mediump float;
|
|
88
|
+
void main() {
|
|
89
|
+
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
|
|
90
|
+
}
|
|
91
|
+
`
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
shader.use();
|
|
95
|
+
|
|
96
|
+
// 创建缓冲区
|
|
97
|
+
var buffer = new Buffer(gl);
|
|
98
|
+
buffer.setAttribute('position', new Float32Array([
|
|
99
|
+
0, 0.5, 0,
|
|
100
|
+
-0.5, -0.5, 0,
|
|
101
|
+
0.5, -0.5, 0
|
|
102
|
+
]));
|
|
103
|
+
buffer.bind();
|
|
104
|
+
|
|
105
|
+
// 绘制
|
|
106
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
107
|
+
```
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# 支付宝小程序 Canvas
|
|
2
|
+
|
|
3
|
+
支付宝小程序使用自定义组件方式接入 VISLite Canvas。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
在支付宝小程序项目中引入 vislite:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install vislite
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 使用方式
|
|
14
|
+
|
|
15
|
+
### 在小程序配置中引入
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"usingComponents": {
|
|
20
|
+
"ui-canvas": "vislite/minialipay/ui-canvas/index"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### 在页面中使用
|
|
26
|
+
|
|
27
|
+
```xml
|
|
28
|
+
<ui-canvas
|
|
29
|
+
id="canvas"
|
|
30
|
+
width="300"
|
|
31
|
+
height="150"
|
|
32
|
+
region="{{true}}"
|
|
33
|
+
onDoTouchstart="onTouchstart"
|
|
34
|
+
/>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 在 JS 中获取画笔
|
|
38
|
+
|
|
39
|
+
```js
|
|
40
|
+
Page({
|
|
41
|
+
onLoad() {
|
|
42
|
+
this.selectComponent('#canvas').fetch().then(painter => {
|
|
43
|
+
this.painter = painter;
|
|
44
|
+
|
|
45
|
+
// 使用画笔
|
|
46
|
+
this.painter.config({
|
|
47
|
+
fillStyle: 'red'
|
|
48
|
+
}).fillCircle(150, 75, 50);
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
onTouchstart(e) {
|
|
53
|
+
console.log('区域:', e.detail.name);
|
|
54
|
+
console.log('坐标:', e.detail.x, e.detail.y);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## 组件属性
|
|
60
|
+
|
|
61
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
62
|
+
|------|------|--------|------|
|
|
63
|
+
| width | Number | 300 | 画布宽度 |
|
|
64
|
+
| height | Number | 150 | 画布高度 |
|
|
65
|
+
| region | Boolean | true | 是否启用区域检测 |
|
|
66
|
+
| onDoTouchstart | Function | - | 点击事件回调 |
|
|
67
|
+
|
|
68
|
+
## 事件详情
|
|
69
|
+
|
|
70
|
+
### onDoTouchstart
|
|
71
|
+
|
|
72
|
+
当用户点击画布时触发,返回对象包含:
|
|
73
|
+
|
|
74
|
+
```js
|
|
75
|
+
{
|
|
76
|
+
name: '区域名称', // 通过 setRegion 设置的区域名
|
|
77
|
+
x: 100, // 点击x坐标
|
|
78
|
+
y: 50 // 点击y坐标
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 注意事项
|
|
83
|
+
|
|
84
|
+
1. 支付宝小程序的 Canvas 上下文获取方式与 Web 不同
|
|
85
|
+
2. 需要使用 `my.createSelectorQuery()` 获取 canvas 节点
|
|
86
|
+
3. 区域检测功能依赖透明度拾取,可能影响性能
|
|
87
|
+
4. 导出图片使用 `toDataURL()` 方法会返回临时文件路径
|
|
88
|
+
|
|
89
|
+
## 与 Web 版的差异
|
|
90
|
+
|
|
91
|
+
| 功能 | Web版 | 支付宝小程序版 |
|
|
92
|
+
|------|-------|---------------|
|
|
93
|
+
| 初始化 | `new Canvas(el)` | 组件 + `fetch()` |
|
|
94
|
+
| 事件绑定 | `bind('click', cb)` | 组件 `onDoTouchstart` |
|
|
95
|
+
| 导出 | `toDataURL()` base64 | `toDataURL()` 临时路径 |
|
|
96
|
+
| 区域检测 | 自动绑定 | 需要组件属性开启 |
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# 微信小程序 Canvas
|
|
2
|
+
|
|
3
|
+
微信小程序使用自定义组件方式接入 VISLite Canvas。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
在微信小程序项目中引入 vislite:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install vislite
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 使用方式
|
|
14
|
+
|
|
15
|
+
### 在小程序配置中引入
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"usingComponents": {
|
|
20
|
+
"ui-canvas": "vislite/miniprogram/ui-canvas/index"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### 在页面中使用
|
|
26
|
+
|
|
27
|
+
```xml
|
|
28
|
+
<ui-canvas
|
|
29
|
+
id="canvas"
|
|
30
|
+
width="300"
|
|
31
|
+
height="150"
|
|
32
|
+
region="{{true}}"
|
|
33
|
+
bind:dotouchstart="onTouchstart"
|
|
34
|
+
/>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 在 JS 中获取画笔
|
|
38
|
+
|
|
39
|
+
```js
|
|
40
|
+
Component({
|
|
41
|
+
lifetimes: {
|
|
42
|
+
ready() {
|
|
43
|
+
this.selectComponent('#canvas').fetch().then(painter => {
|
|
44
|
+
this.painter = painter;
|
|
45
|
+
|
|
46
|
+
// 使用画笔
|
|
47
|
+
this.painter.config({
|
|
48
|
+
fillStyle: 'red'
|
|
49
|
+
}).fillCircle(150, 75, 50);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
methods: {
|
|
55
|
+
onTouchstart(e) {
|
|
56
|
+
console.log('区域:', e.detail.name);
|
|
57
|
+
console.log('坐标:', e.detail.x, e.detail.y);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 组件属性
|
|
64
|
+
|
|
65
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
66
|
+
|------|------|--------|------|
|
|
67
|
+
| width | Number | 300 | 画布宽度 |
|
|
68
|
+
| height | Number | 150 | 画布高度 |
|
|
69
|
+
| region | Boolean | true | 是否启用区域检测 |
|
|
70
|
+
|
|
71
|
+
## 事件
|
|
72
|
+
|
|
73
|
+
### dotouchstart
|
|
74
|
+
|
|
75
|
+
当用户点击画布时触发,返回对象包含:
|
|
76
|
+
|
|
77
|
+
```js
|
|
78
|
+
{
|
|
79
|
+
name: '区域名称', // 通过 setRegion 设置的区域名
|
|
80
|
+
x: 100, // 点击x坐标
|
|
81
|
+
y: 50 // 点击y坐标
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 注意事项
|
|
86
|
+
|
|
87
|
+
1. 微信小程序使用 `wx.createSelectorQuery()` 获取 canvas 节点
|
|
88
|
+
2. 需要处理高清屏的 dpr(设备像素比)缩放
|
|
89
|
+
3. 导出图片需要使用 `wx.canvasToTempFilePath` 转换
|
|
90
|
+
4. 区域检测依赖 `getImageData`,可能存在性能问题
|
|
91
|
+
|
|
92
|
+
## 与 Web 版的差异
|
|
93
|
+
|
|
94
|
+
| 功能 | Web版 | 微信小程序版 |
|
|
95
|
+
|------|-------|------------|
|
|
96
|
+
| 初始化 | `new Canvas(el)` | 组件 + `fetch()` |
|
|
97
|
+
| 事件绑定 | `bind('click', cb)` | 组件 `bind:dotouchstart` |
|
|
98
|
+
| 导出 | `toDataURL()` base64 | `toDataURL()` 需转换 |
|
|
99
|
+
| dpr处理 | 需手动处理 | 组件自动处理 |
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# uni-app Canvas
|
|
2
|
+
|
|
3
|
+
uni-app 是一个跨平台框架,VISLite Canvas 可以直接用于 uni-app 项目。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install vislite
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Web 平台使用
|
|
12
|
+
|
|
13
|
+
```js
|
|
14
|
+
import { Canvas } from 'vislite';
|
|
15
|
+
|
|
16
|
+
export default {
|
|
17
|
+
onReady() {
|
|
18
|
+
this.painter = new Canvas(this.$refs.canvas);
|
|
19
|
+
this.painter.config({
|
|
20
|
+
fillStyle: 'red'
|
|
21
|
+
}).fillCircle(150, 75, 50);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```html
|
|
27
|
+
<template>
|
|
28
|
+
<view ref="canvas" style="width: 300px; height: 150px;"></view>
|
|
29
|
+
</template>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 小程序平台使用
|
|
33
|
+
|
|
34
|
+
### 方式一:使用原生 Canvas
|
|
35
|
+
|
|
36
|
+
uni-app 编译到微信/支付宝小程序时,可以获取原生 canvas 上下文:
|
|
37
|
+
|
|
38
|
+
```js
|
|
39
|
+
import { RawCanvas } from 'vislite';
|
|
40
|
+
|
|
41
|
+
onLoad() {
|
|
42
|
+
uni.createSelectorQuery()
|
|
43
|
+
.select('#canvas')
|
|
44
|
+
.node()
|
|
45
|
+
.exec((res) => {
|
|
46
|
+
const canvas = res[0].node;
|
|
47
|
+
const ctx = canvas.getContext('2d');
|
|
48
|
+
const dpr = uni.getSystemInfoSync().pixelRatio;
|
|
49
|
+
|
|
50
|
+
canvas.width = 300 * dpr;
|
|
51
|
+
canvas.height = 150 * dpr;
|
|
52
|
+
ctx.scale(dpr, dpr);
|
|
53
|
+
|
|
54
|
+
this.painter = new RawCanvas({
|
|
55
|
+
getContext() { return ctx; }
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 方式二:使用各平台组件
|
|
62
|
+
|
|
63
|
+
各小程序平台也可以使用对应的 ui-canvas 组件:
|
|
64
|
+
|
|
65
|
+
#### 微信小程序
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"usingComponents": {
|
|
70
|
+
"ui-canvas": "vislite/miniprogram/ui-canvas/index"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
#### 支付宝小程序
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"usingComponents": {
|
|
80
|
+
"ui-canvas": "vislite/minialipay/ui-canvas/index"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 跨平台注意事项
|
|
86
|
+
|
|
87
|
+
### 平台差异
|
|
88
|
+
|
|
89
|
+
| 功能 | H5 | 微信 | 支付宝 |
|
|
90
|
+
|------|-----|------|--------|
|
|
91
|
+
| new Canvas() | ✅ | ⚠️ 需用组件 | ⚠️ 需用组件 |
|
|
92
|
+
| region检测 | ✅ | ⚠️ 性能差 | ⚠️ 性能差 |
|
|
93
|
+
| toDataURL() | ✅ | ⚠️ 需转换 | ⚠️ 需转换 |
|
|
94
|
+
|
|
95
|
+
### 建议
|
|
96
|
+
|
|
97
|
+
1. **H5 优先**:核心逻辑使用 H5 Canvas 实现
|
|
98
|
+
2. **平台检测**:使用 `uni.getSystemInfo()` 判断平台
|
|
99
|
+
3. **降级处理**:小程序平台可关闭 region 功能提升性能
|
|
100
|
+
|
|
101
|
+
```js
|
|
102
|
+
import { Canvas } from 'vislite';
|
|
103
|
+
|
|
104
|
+
onReady() {
|
|
105
|
+
const systemInfo = uni.getSystemInfoSync();
|
|
106
|
+
|
|
107
|
+
if (systemInfo.platform === 'h5') {
|
|
108
|
+
this.painter = new Canvas(this.$refs.canvas);
|
|
109
|
+
} else {
|
|
110
|
+
// 小程序平台使用组件
|
|
111
|
+
// ...
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
```
|