Canvas動畫

1:Canvas動畫原理

快速切換的靜態畫面。canvas

2:基本步驟

  • 繪製 - 清空 - 繪製 - 清空 - 繪製 ...

3:控制函數

  • setTimeout
  • setInterval
  • requestAnimationFrame

4:四種運動

線性運動

const canvas = document.getElementById('canvas');
    /* 得到 2d 上下文對象 */
    const ctx = canvas.getContext('2d');

    let radialGradient;
    let distance = -50;
    const speed = 5;

    const draw = (axisX) => {
        /* 清空畫布(或部分清空) */
        ctx.clearRect(0, 0, 600, 600);
        radialGradient = ctx.createRadialGradient(distance, 300, 10, distance, 300, 50);
        radialGradient.addColorStop(0, "#FFFFFF");
        radialGradient.addColorStop(1, "#EA7F26");
        ctx.fillStyle = radialGradient;

        ctx.beginPath();
        ctx.moveTo(distance, 300);
        ctx.arc(distance, 300, 50, 0, 2 * Math.PI, false);
        ctx.fill();
        
        distance = distance + speed;
        
        if (distance > 650) distance = -50;

        requestAnimationFrame(draw);
    }

    requestAnimationFrame(draw);ctx.clearRect(0, 0, 600, 600);

ctx.beginPath();
ctx.moveTo(distance, 300);
ctx.arc(distance, 300, 50, 0, 2 * Math.PI, false);
ctx.fill();

distance = distance + speed;

圖片描述
從左到右勻速運動函數

變速運動

const canvas = document.getElementById('canvas');
    /* 得到 2d 上下文對象 */
    const ctx = canvas.getContext('2d');

    let radialGradient;
    let distance = 50;
    const speed = 5;

    let count = 1;

    /*
    * h = 9.8 * (Math.pow(t, 2)) / 2
    */

    const draw = (axisX) => {
        /* 清空畫布(或部分清空) */
        ctx.clearRect(0, 0, 600, 600);
        radialGradient = ctx.createRadialGradient(300, distance, 10, 300, distance, 50);
        radialGradient.addColorStop(0, "#FFFFFF");
        radialGradient.addColorStop(1, "#EA7F26");
        ctx.fillStyle = radialGradient;

        ctx.beginPath();
        ctx.moveTo(300, distance);
        ctx.arc(300, distance, 50, 0, 2 * Math.PI, false);
        ctx.fill();

        count += 1;

        distance = 9.8 * (Math.pow(count, 2)) / 100;
        if (distance > 650) {
            distance = -50;
            count = 1;
        }

        requestAnimationFrame(draw);
    }

    requestAnimationFrame(draw);

圖片描述
從上到下模擬自由落體運動動畫

函數運動(正弦)

const canvas = document.getElementById('canvas');
    /* 得到 2d 上下文對象 */
    const ctx = canvas.getContext('2d');

    let radialGradient;
    let distance = 0;
    let axis = 300;
    const speed = 5;

    const range = 200;

    let angle = 0;

    const draw = (axisX) => {
        /* 清空畫布(或部分清空) */
        // ctx.clearRect(0, 0, 600, 600);
        radialGradient = ctx.createRadialGradient(distance, axis, 10, distance, axis, 50);
        radialGradient.addColorStop(0, "#FFFFFF");
        radialGradient.addColorStop(1, "#EA7F26");
        ctx.fillStyle = radialGradient;

        ctx.beginPath();
        ctx.moveTo(distance, axis);
        ctx.arc(distance, axis, 50, 0, 2 * Math.PI, false);
        ctx.fill();
        
        axis = 300 + Math.sin(angle) * range;

        distance = distance + speed;
        if (distance > 650) {
            distance = 0;
            angle = -.1;
        }

        angle += .1;
        requestAnimationFrame(draw);
    }

    requestAnimationFrame(draw);

圖片描述

環形運動

const canvas = document.getElementById('canvas');
    /* 得到 2d 上下文對象 */
    const ctx = canvas.getContext('2d');
    let radialGradient;

    let angle = 0.1;
    var scope = 20;

    let x = 300;
    let y = 100;

const draw = (axisX) => {
/* 清空畫布(或部分清空) */
    ctx.clearRect(0, 0, 600, 600);
    radialGradient = ctx.createRadialGradient(x, y, 10, x, y, 50);
    radialGradient.addColorStop(0, "#FFFFFF");
    radialGradient.addColorStop(1, "#EA7F26");
    ctx.fillStyle = radialGradient;
    ctx.beginPath();
    ctx.moveTo(x, y);
    ctx.arc(x, y, 50, 0, 2 * Math.PI, false);
    ctx.fill();

    x = x + Math.cos(angle) * scope;
    y = y + Math.sin(angle) * scope;
    angle = angle + .1;

    requestAnimationFrame(draw);
    ctx.closePath();

    ctx.beginPath();
    ctx.arc(300, 300, 200, 0, 2 * Math.PI, false);
    ctx.stroke();
}

requestAnimationFrame(draw);

圖片描述

相關文章
相關標籤/搜索