在html5中,一个canvas标签就对应一个Canvas
对象,我们在JavaScript可以使用document.getElementById()
等常规函数来获取该对象。值得注意的是,在JavaScript中,我们并不是直接操作Canvas
对象,而是通过Canvas
对象来获取对应的图形绘制上下文对象CanvasRenderingContext2D
,然后我们再利用CanvasRenderingContext2D
对象自带的许多绘制图形的函数来绘图。
这就好像是每一张画布都对应一支画笔,要想在画布上绘画,我们就先要拿到对应的画笔,然后使用这支画笔在画布上绘图。CanvasRenderingContext2D
对象就相当于这支画笔。
const canvas = await getCanvasNode('#poster') //通过selector获取canvas实例
const ctx = canvas.getContext('2d')//获取canvas的画笔
canvas.width = 699 //设置画布大小
canvas.height = 890
this.render(canvas, ctx)//开始绘图...
export const getCanvasNode = async (id) => {
if(!id) throw new Error('getCanvasNode没有传入id')
const selector = wx.createSelectorQuery()
const canvasRef = await new Promise(resolve => selector.select(id).node(resolve).exec())
const canvas = canvasRef.node //canvas节点实例
return canvas
}
开始创建一个路径。需要调用 fill
或者 stroke
才会使用路径进行填充或描边
- 在最开始的时候相当于调用了一次
beginPath
。 - 同一个路径内的多次
setFillStyle
、setStrokeStyle
、setLineWidth
等设置,以最后一次设置为准。
把路径移动到画布中的指定点,不创建线条。用 stroke
方法来画线条
const ctx = canvas.getContext('2d')
ctx.moveTo(10, 10)
ctx.lineTo(100, 10)
ctx.moveTo(10, 50)
ctx.lineTo(100, 50)
ctx.stroke()
参数
number x
目标位置的 x 坐标
number y
目标位置的 y 坐标
增加一个新点,然后创建一条从上次指定点到目标点的线。用 stroke
方法来画线条。
const ctx = canvas.getContext('2d')
ctx.moveTo(10, 10)
ctx.rect(10, 10, 100, 50)
ctx.lineTo(110, 60)
ctx.stroke()
对当前路径中的内容进行填充。默认的填充色为黑色
设置填充颜色,需要在填充前设置
const ctx = canvas.getContext('2d')
ctx.fillStyle = 'red'
ctx.fillRect(10, 10, 150, 75)
画出当前路径的边框。默认颜色色为黑色。
画一个矩形(非填充)。 用 strokeStyle 设置矩形线条的颜色,如果没设置默认是黑色。
const ctx = canvas.getContext('2d')
ctx.strokeStyle = ‘red'
ctx.strokeRect(10, 10, 150, 75)
描边的颜色,默认颜色为 black
const ctx = canvas.getContext('2d')
ctx.strokeStyle ='red'
ctx.strokeRect(10, 10, 150, 75)
在画布上绘制被填充的文本
参数
string text
在画布上输出的文本
number x
绘制文本的左上角 x 坐标位置
number y
绘制文本的左上角 y 坐标位置
number maxWidth
需要绘制的最大宽度,可选
示例代码
export const fillText = (ctx,context, fontStyle, color, x, y) => {
if(!ctx) throw new Error('fillText没有传入ctx')
return new Promise((resolve, reject) => {
// 填充文字
ctx.fillStyle = color || '#000' //可以设置文字颜色
ctx.font = fontStyle || '26px sans-serif'
ctx.fillText(context,x,y)
resolve()
})
}
fillText(ctx,'一键加油小程序','26px sans-serif','#000',95,780)
保存绘图上下文。
恢复之前保存的绘图上下文。
绘制图像到画布
参数
string imageResource
所要绘制的图片资源(网络图片要通过 getImageInfo / downloadFile 先下载)
number sx
需要绘制到画布中的,imageResource的矩形(裁剪)选择框的左上角 x 坐标
number sy
需要绘制到画布中的,imageResource的矩形(裁剪)选择框的左上角 y 坐标
number sWidth
需要绘制到画布中的,imageResource的矩形(裁剪)选择框的宽度
number sHeight
需要绘制到画布中的,imageResource的矩形(裁剪)选择框的高度
number dx
imageResource的左上角在目标 canvas 上 x 轴的位置
number dy
imageResource的左上角在目标 canvas 上 y 轴的位置
number dWidth
在目标画布上绘制imageResource的宽度,允许对绘制的imageResource进行缩放
number dHeight
在目标画布上绘制imageResource的高度,允许对绘制的imageResource进行缩放
有三个版本的写法:
- drawImage(imageResource, dx, dy)
- drawImage(imageResource, dx, dy, dWidth, dHeight)
- drawImage(imageResource, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) 从 1.9.0 起支持
const ctx = canvas.getContext('2d')
wx.chooseImage({
success: function(res){
ctx.drawImage(res.tempFilePaths[0], 0, 0, 150, 100)
}
})
const canvas = await getCanvasNode('#poster')
const ctx = canvas.getContext('2d')
canvas.width = 699 //画布设置宽度
canvas.height = 890
let canvasImg = canvas.createImage()//创建图片
await new Promise((resolve, reject) => { //等待图片加载完成
canvasImg.onload = (e) => {
resolve()
}
canvasImg.onerror = (e) => {
reject()
}
let url = '/static/images/logo.png'
canvasImg.src = url
})
ctx.drawImage(canvasImg, 0, 0, 699, 890) //绘图 在(x,y)处画699*890的图