canvas
基础库 3.18.0 开始支持,低版本需做兼容处理。
画布。3.58.0 起支持一套新 Canvas 2D 接口(需指定 type 属性)。相关api:获取 canvas 实例。
属性
属性 | 类型 | 默认值 | 必填 | 说明 | 版本 |
---|---|---|---|---|---|
id | string | 是 | canvas 元素的 id ,若指定了 type 则必须指定该属性 | 3.58.0 | |
type | string | "" | 否 | 指定 canvas 类型,支持 2d 和 webgl | 3.58.0 |
canvas-id | string | "" | 是 | canvas 组件的唯一标识符,若指定了 type 则无需再指定该属性 | 3.18.0 |
disable-scroll | boolean | false | 否 | 当在 canvas 中移动时且有绑定手势事件时,禁止屏幕滚动以及下拉刷新 | 3.18.0 |
resize | eventhandle | 否 | 当canvas宽高变化时 | 3.42.0 | |
touchstart | eventhandle | 否 | 手指触摸动作开始 | 3.18.0 | |
touchmove | eventhandle | 否 | 手指触摸后移动 | 3.18.0 | |
touchend | eventhandle | 否 | 手指触摸动作结束 | 3.18.0 | |
touchcancel | eventhandle | 否 | 手指触摸动作被打断,如来电提醒,弹窗 | 3.18.0 | |
longtap | eventhandle | 否 | 手指长按 500ms 之后触发,触发了长按事件后进行移动不会触发屏幕的滚动 | 3.18.0 | |
error | eventhandle | 否 | 当发生错误时触发 error 事件,detail = {errMsg} | 3.18.0 |
Bug & Tip
- tip:canvas 标签默认宽度300px、高度150px
- tip:同一页面中的 canvas-id 不可重复,如果使用一个已经出现过的 canvas-id,该 canvas 标签对应的画布将不再正常工作
- tip:请注意原生组件使用限制
- tip:resize 事件的触发可能会由于使用特殊样式单位(百分比、vw、vh等)引起的横竖屏变化触发。
- Canvas 2期方案( 3.58.0 )需要显式设置画布宽高,如不设置默认使用 canvas 组件样式大小,如样式也不设置则默认:300*150。
- Canvas 2期方案( 3.58.0 )设置画布的 width 和 height,没有 getContext 前设置是不会触发 resize 事件的。
- Canvas 2期方案( 3.58.0 )双端差异,通过设置组件样式变化,安卓可以缩放画布,IOS无法缩放,会清空画布。
- Canvas 2期方案( 3.58.0 )安卓有一定几率下载不了远端能力包,需要用户在安卓下考虑降级方案。
- 提供API判断:bl.isCanvasSupportedSync()
- canvas error 事件中会返回错误信息
方案说明
3.18.0 1期方案
获取 canvas:bl.createCanvasContext
3.58.0 2期方案
获取 canvas:RenderingContext
Canvas 2D 示例代码
<template>
<b-canvas type="2d" id="myCanvas"></b-canvas>
</template>
<script>
export default {
onReady() {
bl.createSelectorQuery()
.select("#myCanvas")
.fields({
node: true,
size: true,
})
.exec((res) => {
// 如果是降级或不支持的版本,node 是 null,需要在此判断。
if (res[0].node) {
const canvas = res[0].node;
const ctx = canvas.getContext("2d");
const dpr = bl.getSystemInfoSync().pixelRatio;
canvas.width = res[0].width * dpr;
canvas.height = res[0].height * dpr;
ctx.scale(dpr, dpr);
ctx.fillRect(0, 0, 100, 100);
}
});
},
};
</script>
<style lang="less" scoped></style>
WebGL 示例代码
<template>
<b-canvas type="webgl" id="myCanvas"></b-canvas>
</template>
<script>
export default {
onReady() {
bl.createSelectorQuery()
.select("#myCanvas")
.fields({
node: true,
size: true,
})
.exec((res) => {
// 如果是降级或不支持的版本,node 是 null,需要在此判断。
if (res[0].node) {
const canvas = res[0].node;
const gl = canvas.getContext('webgl')
gl.clearColor(1, 0, 1, 1)
gl.clear(gl.COLOR_BUFFER_BIT)
}
});
},
};
</script>
<style lang="less" scoped></style>
示例代码(旧的接口)
<template>
<b-canvas canvas-id="myCanvas"></b-canvas>
</template>
<script>
export default {
data() {
return {}
},
methods: {},
onReady(){
let _ctx = bl.createCanvasContext('myCanvas');
_ctx.beginPath();
_ctx.moveTo(20,20);
_ctx.quadraticCurveTo(20,100,200,20);
_ctx.stroke();
_ctx.draw();
}
}
</script>
<style lang="less" scoped></style>
error 信息
错误code | 错误信息 | 版本 |
---|---|---|
2 | 当前版本不支持 canvas 2 期方案,请做降级处理。 | 3.58.0 |