canvas画布API

本文编辑: JeremyLu JeremyLu浏览 4356 版权所有,严禁转载

接口说明:

<canvas />组件只能提供图像显示容器,不具备绘制能力,所以还需要使用脚本来完成实际的绘图任务,交由以下三个canvas API完成。

接口 说明
wx.createContext() 创建并返回绘图上下文context对象
wx.drawCanvas(OBJECT) 绘制画布
wx.canvasToTempFilePath(OBJECT) 把当前canvas上的内容保存为图片

wx.createContext()创建并返回一个context上下文对象,用于记录绘制操作,并返回actions数组,交给wx.drawCanvas(OBJECT)绑定<canvas />组件,并将actions绘制在<canvas />组件上;如果想将图像保存为图片,调用wx.canvasToTempFilePath(OBJECT)接口。

接口用法:

  • wx.drawCanvas绘制接口

参数 类型 说明
canvasId String 画布标识,传入<canvas />的canvas-id
actions Array 绘图动作数组,由 wx.createContext 创建的 context,调用 getActions 方法导出绘图动作数组。
reserve Boolean 本次绘制是否接着上一次绘制,即reserve参数为false,则在本次调用drawCanvas绘制之前native层应先清空画布再继续绘制;若reserver参数为true,则保留当前画布上的内容,本次调用drawCanvas绘制的内容覆盖在上面,默认 false

wxml

<canvas canvas-id="canvas" ></canvas>

js

var context = wx.createContext()
wx.drawCanvas({
    canvasId: 'canvas',
    actions: context.getActions()
})
  • wx.createContext接口返回对象的方法列表:

方法 说明
getActions 返回绘制操作记录actions数组
clearActions 清空context绘制操作记录
scale 横纵坐标会被缩放
rotate 以原点为中心,顺时针旋转当前坐标轴
translate 对当前坐标系的原点(0, 0)进行变换,默认的坐标系原点为页面左上角。
save 保存当前坐标轴的缩放、旋转、平移信息
restore 恢复之前保存过的坐标轴的缩放、旋转、平移信息
clearRect 在给定的矩形区域内,清除画布上的像素
fillText 在画布上绘制被填充的文本
drawImage 在画布上绘制图像
fill 对当前路径进行填充
stroke 对当前路径进行描边
beginPath 开始一个路径
closePath 关闭一个路径
moveTo 把路径移动到画布中的指定点,但不创建线条
lineTo 添加一个新点,然后在画布中创建从该点到最后指定点的线条
rect 添加一个矩形路径到当前路径
arc 添加一个弧形路径到当前路径,顺时针绘制
quadraticCurveTo 创建二次方贝塞尔曲线
bezierCurveTo 创建三次方贝塞尔曲线
setFillStyle 设置填充样式
setStrokeStyle 设置线条样式
setGlobalAlpha 设置全局画笔透明度
setShadow 设置阴影
setFontSize 设置字体大小
setLineCap 设置线条端点的样式
setLineJoin 设置两线相交处的样式
setLineWidth 设置线条宽度
setMiterLimit 设置最大倾斜

canvas缩放、旋转、平移

wxml

<canvas canvas-id="canvas_scale"></canvas>
<canvas canvas-id="canvas_rotate"></canvas>
<canvas canvas-id="canvas_translate"></canvas>

js

onReady:function(){
    var context = wx.createContext()
    context.rect(5, 5, 30, 30)
    context.stroke()
    //缩放
    context.scale(2,2)
    context.stroke()
    context.scale(2,2)
    context.stroke()
    wx.drawCanvas({
      canvasId: 'canvas_scale',
      actions: context.getActions()
    })
    context.clearActions()

    context.rect(30, 30, 100, 100)
    context.stroke()
    //旋转
    context.rotate(0.15)
    context.stroke()
    wx.drawCanvas({
      canvasId: 'canvas_rotate',
      actions: context.getActions()
    })
    context.clearActions()

    context.rect(30, 30, 100, 100)
    context.stroke()
    //平移
    context.translate(10, 10)
    context.stroke()
     wx.drawCanvas({
      canvasId: 'canvas_translate',
      actions: context.getActions()
    })
  }

wxss

canvas{
    border: 1px solid #E0E0E0;
    margin-top: 10px;
}

canvas绘制

wxml

<canvas canvas-id="canvas1"></canvas>
<canvas canvas-id="canvas2"></canvas>

js

onReady:function(){
    var context = wx.createContext()
    context.rect(15, 15, 100, 100)
    context.fill()
    context.stroke()
    //清除指定范内的像素
    context.clearRect(25, 25, 80, 80)
    //显示文字
    context.fillText('Text', 40, 40)
    wx.drawCanvas({
        canvasId: 'canvas1',
        actions: context.getActions()
    })
    context.clearActions()
    //显示图片
    wx.chooseImage({
      success: function(res) {
        context.drawImage(res.tempFilePaths[0], 0, 0)
        wx.drawCanvas({
          canvasId: 'canvas2',
          actions: context.getActions()
        })
      }
    })
  }

wxss

canvas{
    border: 1px solid lightgray;
    margin-top: 10px;
}

canvas路径

wxml

<canvas canvas-id="canvas1"></canvas>

js

onReady:function(){
    // 使用 wx.createContext 获取绘图上下文 context
    var context = wx.createContext()

    context.setStrokeStyle("#00ff00")
    context.setLineWidth(5)
    context.rect(0, 0, 200, 200)
    context.stroke()
    context.setStrokeStyle("#ff0000")
    context.setLineWidth(2)
    context.moveTo(160, 100)
    context.arc(100, 100, 60, 0, 2 * Math.PI, true)
    context.moveTo(140, 100)
    context.arc(100, 100, 40, 0, Math.PI, false)
    context.moveTo(85, 80)
    context.arc(80, 80, 5, 0, 2 * Math.PI, true)
    context.moveTo(125, 80)
    context.arc(120, 80, 5, 0, 2 * Math.PI, true)
    context.stroke()
    wx.drawCanvas({
      canvasId: 'canvas1',
      actions: context.getActions()
    })
  }

wxss

canvas{
    height: 500px;
}

canvas样式

wxml

<canvas canvas-id="canvas1"></canvas>
<button type="default" size="default" bindtap="saveas">另存</button>

js

onReady:function(){
    var context = wx.createContext()

    context.setFillStyle("#FF00FF")
    context.setStrokeStyle("#00FFFF")
    context.setGlobalAlpha(1)
    context.setShadow(10,10,10, '#000000')
    context.setFontSize(18)
    context.setLineWidth(3)
    context.setLineCap('round');
    context.setLineJoin('round')
    context.rect(50, 50, 100, 100)
    context.fill()
    context.stroke()
    wx.drawCanvas({
      canvasId: 'canvas1',
      actions: context.getActions()
    })
  },
  //canvas另存为图片
  saveas: function(e){
    wx.canvasToTempFilePath({
      canvasId: 'canvas1',
      success: function(res){
        console.log(res.tempFilePath)
      }
  }

主要方法

scale:缩放

在调用scale方法后,之后创建的路径其横纵坐标会被缩放。多次调用scale,倍数会相乘。

参数 类型 描述
scaleWidth Number 横坐标缩放的倍数,scaleWidth在0~1表示缩小,scaleWidth>1表示放大
scaleHeight Number 纵坐标轴缩放的倍数,scaleHeight在0~1表示缩小,scaleHeight>1表示放大

rotate:旋转

以原点为中心,原点可以用 translate方法修改。顺时针旋转当前坐标轴。多次调用rotate,旋转的角度会叠加。

参数 类型 描述
rotate Number 旋转角度,以弧度计;degrees * Math.PI/180;degrees范围为0~360

translate:平移

对当前坐标系的原点(0, 0)进行变换,默认的坐标系原点为页面左上角。

参数 类型 描述
x Number 水平坐标平移量
y Number 竖直坐标平移量

clearRect:清除指定区域内容

清除画布上在该矩形区域内的内容。

参数 类型 描述
x Number 矩形区域左上角的x坐标
y Number 矩形区域左上角的y坐标
width Number 矩形区域的宽度
height Number 矩形区域的高度

drawImage:绘制图像

绘制图像,图像保持原始尺寸。

参数 类型 描述
imageResource String 所要绘制的图片资源;通过chooseImage得到一个文件路径或者一个项目目录内的图片
x Number 图像左上角的x坐标
y Number 图像左上角的y坐标
width Number 图像宽度
height Number 图像高度

fillText:填充文本

在画布上绘制被填充的文本

参数 类型 描述
text String 在画布上输出的文本
x Number 绘制文本的左上角x坐标位置
y Number 绘制文本的左上角y坐标位置

beginPath

开始创建一个路径,需要调用fill或者stroke才会使用路径进行填充或描边。同一个路径内的多次setFillStyle、setStrokeStyle、setLineWidth等设置,以最后一次设置为准。

closePage

关闭一个路径。

moveTo

把路径移动到画布中的指定点,不创建线条。

参数 类型 描述
x Number 目标位置的x坐标
y Number 目标位置的y坐标

lineTo

在当前位置添加一个新点,然后在画布中创建从该点到最后指定点的路径。

参数 类型 描述
x Number 目标位置的x坐标
y Number 目标位置的y坐标

rect:添加矩形

添加一个矩形路径到当前路径。

参数 类型 描述
x Number 矩形路径左上角的x坐标
y Number 矩形路径左上角的y坐标
width Number 矩形路径的宽度
height Number 矩形路径的高度

arc:画圆

添加一个弧形路径到当前路径,顺时针绘制。

参数 类型 描述
x Number 矩形路径左上角的x坐标
y Number 矩形路径左上角的y坐标
radius Number 矩形路径的宽度
startAngle Number 起始弧度
sweepAngle Number 从起始弧度开始,扫过的弧度

quadraticCurveTo:二次贝塞尔曲线

创建二次贝塞尔曲线路径

参数 类型 描述
cpx Number 贝塞尔控制点的x坐标
cpy Number 贝塞尔控制点的y坐标
x Number 矩形路径左上角的x坐标
y Number 矩形路径左上角的y坐标

bezierCurveTo:三次方贝塞尔曲线

创建三次方贝塞尔曲线路径

参数 类型 描述
cp1x Number 第一个贝塞尔控制点的 x 坐标
cp1y Number 第一个贝塞尔控制点的 y 坐标
cp2x Number 第二个贝塞尔控制点的 x 坐标
cp2y Number 第二个贝塞尔控制点的 y 坐标
x Number 矩形路径左上角的x坐标
y Number 矩形路径左上角的y坐标

setFillStyle:设置颜色为填充样式

参数 类型 描述
color String 设置为填充样式的颜色;’rgb(255, 0, 0)’或’rgba(255, 0, 0, 0.6)’或’#ff0000’格式的颜色字符串

setStrokeStyle:设置纯色描边

参数 类型 描述
color String 设置纯色描边;’rgb(255, 0, 0)’或’rgba(255, 0, 0, 0.6)’或’#ff0000’格式的颜色字符串

setGlobalAlpha

置全局画笔透明度。

参数 类型 描述
alpha Number 透明度,0 表示完全透明,1 表示完全不透明

setShadow:阴影

设置阴影样式

参数 类型 描述
offsetX Number 阴影相对于形状在水平方向的偏移
offsetY Number 阴影相对于形状在竖直方向的偏移
blur Number 阴影的模糊级别,数值越大越模糊;0~100
color Color 阴影的颜色;’rgb(255, 0, 0)’或’rgba(255, 0, 0, 0.6)’或’#ff0000’格式的颜色字符串

setFontSize:字号

设置字体的字号。

参数 类型 描述
fontSize Number 字体的字号

setLineWidth:线宽

设置线条的宽度

参数 类型 描述
lineWidth Number 线条的宽度

setLineCap

设置线条的结束端点样式。

参数 类型 描述
lineCap String 线条的结束端点样式;取值范围’butt’、’round’、’square’

setLineJoin

设置两条线相交时,所创建的拐角类型。

参数 类型 描述
lineJoin String 两条线相交时,所创建的拐角类型;取值范围’bevel’、’round’、’miter’

setMiterLimit

设置最大斜接长度,斜接长度指的是在两条线交汇处内角和外角之间的距离。 当 setLineJoin为 miter 时才有效。超过最大倾斜长度的,连接处将以 lineJoin 为 bevel 来显示。

参数 类型 描述
miterLimit Number 最大斜接长度


  • wx.canvasToTempFilePath图片另存

wxml

<canvas canvas-id="canvas1"></canvas>
<button type="default" size="default" bindtap="saveas">另存</button>

js

saveas: function(e){
    wx.canvasToTempFilePath({
      canvasId: 'canvas1',
      success: function(res){
        console.log(res.tempFilePath)
      }
}

主要方法:

参数 描述
canvasId 画布标识,传入<canvas />的 canvas-id

相关链接:

如有技术问题或对本文有反馈,请加入QQ群:
微信小程序实战5营: 微信小程序Club实战5营