moveTo 与 lineTo

moveTo和lineTo是路径绑制中最常用的两个方法。moveTo移动画笔位置,lineTo绑制直线。

moveTo 移动画笔

moveTo将画笔移动到指定位置,不留下痕迹:

ctx.moveTo(x, y)
参数类型说明
xnumber目标位置的x坐标
ynumber目标位置的y坐标

lineTo 画直线

lineTo从当前位置画直线到目标位置:

ctx.lineTo(x, y)

基本用法

const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')

ctx.beginPath()
ctx.moveTo(50, 50)    // 移动到起点
ctx.lineTo(200, 150)  // 画线到终点
ctx.stroke()

moveTo与lineTo工作原理

moveTo与lineTo工作原理

起点 (moveTo)
终点 (lineTo)
新起点 (新moveTo)

连续画线

lineTo会从上一个点继续:

ctx.beginPath()
ctx.moveTo(50, 50)
ctx.lineTo(150, 50)   // 第一段
ctx.lineTo(150, 150)  // 第二段
ctx.lineTo(50, 150)   // 第三段
ctx.closePath()       // 闭合
ctx.stroke()

连续画线演示

连续lineTo绘制矩形

多个独立图形

使用多个moveTo创建独立图形:

ctx.beginPath()

// 第一个图形
ctx.moveTo(50, 50)
ctx.lineTo(100, 50)
ctx.lineTo(100, 100)
ctx.closePath()

// 第二个图形(新的moveTo)
ctx.moveTo(150, 50)
ctx.lineTo(200, 50)
ctx.lineTo(200, 100)
ctx.closePath()

ctx.stroke()

折线图示例

月度销售数据折线图

相对坐标画线

封装相对坐标的画线函数:

function line(ctx, x1, y1, x2, y2) {
  ctx.beginPath()
  ctx.moveTo(x1, y1)
  ctx.lineTo(x2, y2)
  ctx.stroke()
}

// 使用
line(ctx, 50, 50, 200, 150)

获取当前位置

Canvas没有直接获取当前位置的方法,需要自己维护:

let currentX = 0
let currentY = 0

function myMoveTo(ctx, x, y) {
  ctx.moveTo(x, y)
  currentX = x
  currentY = y
}

function myLineTo(ctx, x, y) {
  ctx.lineTo(x, y)
  currentX = x
  currentY = y
}

注意事项

没有moveTo时

ctx.beginPath()
ctx.lineTo(100, 100)  // 从(0,0)开始
ctx.stroke()

如果第一个操作是lineTo,起点默认为(0,0)。

连续使用moveTo

ctx.beginPath()
ctx.moveTo(50, 50)
ctx.moveTo(100, 100)  // 覆盖上一个moveTo
ctx.lineTo(200, 200)
ctx.stroke()
// 只显示从(100,100)到(200,200)的线

lineTo创建子路径

ctx.beginPath()
ctx.moveTo(50, 50)
ctx.lineTo(100, 100)
ctx.moveTo(150, 50)  // 新的子路径
ctx.lineTo(200, 100)
ctx.stroke()

没有moveTo时的行为

没有moveTo,从(0,0)开始

有moveTo,从指定位置开始