动画基础

Canvas动画基础完整教程,掌握动画原理、动画循环、帧率控制和性能优化技巧。Canvas动画是通过不断重绘画面来创造运动效果的技术,是游戏开发、数据可视化和交互应用的核心。

什么是Canvas动画

动画的本质是"视觉暂留"现象——人眼在看到图像后,图像会在视网膜上停留约1/16秒。通过快速连续显示略有差异的画面,大脑会将这些画面融合成流畅的运动。

动画的基本原理

Canvas动画遵循一个简单循环:

  1. 清空画布:清除上一帧的内容
  2. 更新状态:计算下一帧的位置、颜色等属性
  3. 绘制画面:根据新状态绘制图形
  4. 重复循环:继续下一帧
function animate() {
  ctx.clearRect(0, 0, canvas.width, canvas.height)
  update()
  draw()
  requestAnimationFrame(animate)
}

帧的概念

  • :动画中的单幅画面
  • 帧率(FPS):每秒显示的帧数,如60FPS表示每秒60帧
  • 帧间隔:两帧之间的时间间隔,60FPS约为16.67毫秒

动画的类型

类型说明示例
帧动画逐帧播放预设画面GIF动画、精灵动画
属性动画平滑改变属性值移动、缩放、旋转
物理动画基于物理规律运动弹跳、摆动、碰撞
粒子动画大量粒子的运动烟花、雨雪、火焰

动画方法概览

方法说明适用场景
setInterval固定间隔执行简单动画、兼容旧浏览器
setTimeout递归调用需要精确控制间隔
requestAnimationFrame浏览器优化现代动画首选

基本动画演示

简单移动动画

动画循环结构

一个完整的动画循环包含以下要素:

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

let x = 0
let y = 100
let speed = 2

function update() {
  x += speed
  if (x > canvas.width) x = 0
}

function draw() {
  ctx.clearRect(0, 0, canvas.width, canvas.height)
  ctx.fillStyle = 'blue'
  ctx.fillRect(x, y, 50, 50)
}

function animate() {
  update()
  draw()
  requestAnimationFrame(animate)
}

animate()

动画状态管理

动画中需要管理各种状态:

位置状态

const ball = {
  x: 100,
  y: 100,
  vx: 2,
  vy: 1
}

时间状态

let startTime = null
let lastTime = 0
let elapsedTime = 0

播放状态

let isPlaying = false
let isPaused = false
let currentFrame = 0

动画控制演示

动画播放控制