绘制模式

Canvas绘制模式详解,掌握填充规则、绘制顺序和图层管理技巧。Canvas绘制模式涉及填充规则、绘制顺序和图层管理等概念,是实现复杂图形效果的基础。

填充规则

Canvas支持两种填充规则,用于判断点是否在路径内部:

nonzero(非零环绕)

默认规则,根据路径方向判断:

ctx.fill('nonzero')
ctx.clip('nonzero')

原理:从点向任意方向发射射线,计算与路径的交点。顺时针方向+1,逆时针方向-1,结果非零则在内部。

evenodd(奇偶)

奇偶规则,用于创建镂空效果:

ctx.fill('evenodd')
ctx.clip('evenodd')

原理:从点向任意方向发射射线,计算与路径的交点数量。奇数在内部,偶数在外部。

填充规则演示

填充规则对比

复杂路径填充

复杂路径填充

绘制顺序

Canvas按照代码执行顺序绘制,后绘制的内容会覆盖先绘制的内容:

ctx.fillStyle = 'blue'
ctx.fillRect(50, 50, 100, 100)  // 先绘制蓝色

ctx.fillStyle = 'red'
ctx.fillRect(100, 100, 100, 100)  // 后绘制红色,覆盖蓝色

绘制顺序演示

绘制顺序效果

图层管理

通过控制绘制顺序实现图层效果:

背景层

// 最底层:背景
ctx.fillStyle = '#f0f0f0'
ctx.fillRect(0, 0, canvas.width, canvas.height)

内容层

// 中间层:内容
ctx.drawImage(image, 0, 0)

遮罩层

// 顶层:遮罩或效果
ctx.globalAlpha = 0.5
ctx.fillStyle = '#000'
ctx.fillRect(0, 0, canvas.width, canvas.height)

图层管理演示

图层管理示例

绘制模式组合

结合合成模式和透明度实现复杂效果:

绘制模式组合

离屏Canvas

使用离屏Canvas实现复杂图层:

const offscreen = document.createElement('canvas')
offscreen.width = 400
offscreen.height = 300
const offCtx = offscreen.getContext('2d')

// 在离屏Canvas上绑制复杂内容
offCtx.fillStyle = 'red'
offCtx.fillRect(0, 0, 200, 200)

// 将离屏Canvas绘制到主Canvas
ctx.drawImage(offscreen, 0, 0)

离屏Canvas演示

离屏Canvas图层

注意事项

填充规则选择

根据需要选择合适的填充规则,evenodd适合镂空效果。

绘制顺序

注意绘制顺序,后绘制的内容会覆盖先绘制的内容。

性能优化

复杂图层考虑使用离屏Canvas缓存。

状态管理

使用save/restore管理绑制状态。