Canvas 画布

所有在 <canvas> 中的画图必须用 JavaScript 完成:

QML:(我们在接下来的例子中如无特殊声明都会用这个 QML 为模板,不再重复)

  1. <canvas canvas-id="myCanvas" style="border: 1px solid;" />

JS:(我们在接下来的例子中会将 JS 放在 onLoad 中)

  1. const ctx = qq.createCanvasContext('myCanvas')
  2. ctx.setFillStyle('red')
  3. ctx.fillRect(10, 10, 150, 75)
  4. ctx.draw()

第一步:创建一个 Canvas 绘图上下文

首先,我们需要创建一个 Canvas 绘图上下文 CanvasContext

CanvasContext 是小程序内建的一个对象,有一些绘图的方法:

  1. const ctx = qq.createCanvasContext('myCanvas')

第二步:使用 Canvas 绘图上下文进行绘图描述

接着,我们来描述要在 Canvas 中绘制什么内容。

设置绘图上下文的填充色为红色:

  1. ctx.setFillStyle('red')

fillRect(x, y, width, height) 方法画一个矩形,填充为刚刚设置的红色:

  1. ctx.fillRect(10, 10, 150, 75)

第三步:画图

告诉 <canvas> 组件你要将刚刚的描述绘制上去:

  1. ctx.draw()

结果:

画布 - 图1

坐标系

canvas 是在一个二维的网格当中。左上角的坐标为(0, 0)

在上一节,我们用了这个方法 fillRect(0, 0, 150, 75)

它的含义为:从左上角(0, 0)开始,画一个150 x 75px 的矩形。

代码示例

我们可以在 <canvas> 中加上一些事件,来观测它的坐标系

  1. <canvas
  2. canvas-id="myCanvas"
  3. style="margin: 5px; border:1px solid #d3d3d3;"
  4. bindtouchstart="start"
  5. bindtouchmove="move"
  6. bindtouchend="end"
  7. />
  8. <view hidden="{{hidden}}">
  9. Coordinates: ({{x}}, {{y}})
  10. </view>
  1. Page({
  2. data: {
  3. x: 0,
  4. y: 0,
  5. hidden: true
  6. },
  7. start(e) {
  8. this.setData({
  9. hidden: false,
  10. x: e.touches[0].x,
  11. y: e.touches[0].y
  12. })
  13. },
  14. move(e) {
  15. this.setData({
  16. x: e.touches[0].x,
  17. y: e.touches[0].y
  18. })
  19. },
  20. end(e) {
  21. this.setData({
  22. hidden: true
  23. })
  24. }
  25. })

当你把手指放到 canvas 中,就会在下边显示出触碰点的坐标:

画布 - 图2

渐变

渐变能用于填充一个矩形,圆,线,文字等。填充色可以不固定位固定的一种颜色。

我们提供了两种颜色渐变的方式:

addColorStop(position, color) 方法用于指定颜色渐变点的位置和颜色,位置必须位于0到1之间。

可以用setFillStylesetStrokeStyle 方法设置渐变,然后进行画图描述。

使用 createLinearGradient()

  1. const ctx = qq.createCanvasContext('myCanvas')
  2. // Create linear gradient
  3. const grd = ctx.createLinearGradient(0, 0, 200, 0)
  4. grd.addColorStop(0, 'red')
  5. grd.addColorStop(1, 'white')
  6. // Fill with gradient
  7. ctx.setFillStyle(grd)
  8. ctx.fillRect(10, 10, 150, 80)
  9. ctx.draw()

画布 - 图3

使用 createCircularGradient()

  1. const ctx = qq.createCanvasContext('myCanvas')
  2. // Create circular gradient
  3. const grd = ctx.createCircularGradient(75, 50, 50)
  4. grd.addColorStop(0, 'red')
  5. grd.addColorStop(1, 'white')
  6. // Fill with gradient
  7. ctx.setFillStyle(grd)
  8. ctx.fillRect(10, 10, 150, 80)
  9. ctx.draw()

画布 - 图4