# 1、在微信中实例化
使用query.select()进行实例化,获取到node节点,使用canvas.getContext('2d')实例化上下文
<canvas type="2d" canvas-id="elBgId" id="elBgId"></canvas>
const query = uni.createSelectorQuery().in(this)
query
.select('#' + this.elBgId)
.fields({
node: true,
size: true
})
.exec(res => {
if (res[0]) {
const canvas = res[0].node;
const ctx = canvas.getContext('2d');
}
});
# 2、画圆成椭圆的问题
如果只设置了canvas的style:{width: 200px;height: 200px},就会导致画出来的圆形,变成椭圆;
原因:canvas的画布是300*150的画布,如果只设置了canvas的宽高,只是对画布进行了不等比缩小,导致画出来的图形产生形变;
解决方法:同时设置canvas的属性width和height,就可以了
代码如下:
<canvas height="200" width="200" type="2d" canvas-id="elBgId" id="elBgId"
style="{
width: '200px',
height: '200px'}"></canvas>
# 3、边缘模糊有毛边处理
这里采用等比放大大的画布画出来,然后放在等比缩小的盒子里显示,一般使用屏幕的像素比
注意:这时候画出来样式的大小也要跟着等比放大
代码如下:
<template>
<canvas height="widthPx" width="widthPx" type="2d" class="u-canvas-bg" :canvas-id="elBgId" :id="elBgId"
:style="{
width: widthPx + 'px',
height: widthPx + 'px'
}"></canvas>
</template>
<script>
export default {
data() {
return {
elBgId: 'uCircleProgressBgId',
elId: 'uCircleProgressElId',
widthPx: 200,
pixelRatio: 1
}
[CircleProgress](..%2F..%2F..%2F..%2FCircleProgress) },
created() {
// 获取像素比
this.pixelRatio = uni.getWindowInfo().pixelRatio
},
mounted() {
// 在h5端,必须要做一点延时才起作用,this.$nextTick()无效(HX2.4.7)
setTimeout(() => {
this.drewCircle();
}, 50);
},
methods: {
drewCircle() {
const query = uni.createSelectorQuery().in(this)
query
.select('#' + this.elBgId)
.fields({
node: true,
size: true
})
.exec(res => {
if (res[0]) {
const canvas = res[0].node;
const ctx = canvas.getContext('2d');
// 等比放大画布
canvas.width = this.widthPx * this.pixelRatio
canvas.height = this.widthPx * this.pixelRatio
// 设置圆环宽度 等比放大
ctx.lineWidth = this.borderWidthPx * this.pixelRatio
// 开始描绘路径
ctx.beginPath();
// 设置一个原点(110,110),半径为100的圆的路径到当前路径
let radius = this.widthPx * this.pixelRatio / 2;
ctx.arc(radius, radius,
radius - this.borderWidthPx * this.pixelRatio,
0, 2 * Math.PI, false);
// 对路径进行描绘
ctx.stroke();
}
});
}
}
}
</script>
← 样式相关