Canvas动画

2019/7/23 14:06:36 人评论 次浏览 分类:学习教程

1: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);

在这里插入图片描述

相关资讯

    暂无相关的资讯...

共有访客发表了评论 网友评论

验证码: 看不清楚?
    -->