Canvas 动画制作

在前面的两篇文章Canvas 基本绘制(下)Canvas 基本绘制(上)中,介绍了Canvas的基本绘制。学过SVG的童鞋应该知道它是可以制作动画,那么Canvas是否能制作动画呢?答案是肯定的。所以今天我们就给大家来介绍一下Canvas制作动画。

Canvas动画制作原理

简单一句话概括:不断的绘制与清除。

Canvas实现动画步骤(不断循环)

1、更新绘制的对象(比如位置的移动)

2、清除画布

3、在画布上重新绘制对象

Canvas 动画相关命令

clearRect方法

context.clearRect(x,y,width,height);方法清空给定矩形内的指定像素。

save与restore方法

所有的 2D 绘图上下文属性都是可保存和恢复的属性,但绘制的内容可不是,也就是说你恢复了绘图上下文,并不会恢复其所绘制的图形。

用来保存Canvas的状态(类似数组的入栈操作)。

用来恢复Canvas之前保存的状态(类似数组的出栈操作)。

这种状态包括:strokeStyle, fillStyle, lineWidth, lineCap, shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor, font, textAlign, textBaseline。

save与restore方法实例操作

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>HTML5学堂</title>
    <link rel="stylesheet" href="../css/reset.css">
    <script src="../js/jquery-1.8.3.min.js" charset="utf-8" type="text/javascript"></script>
    <style>
        .draw {
            margin: 30px 20px;
            border: 1px solid red;
        }
    </style>
</head>
<body>
    <canvas id="testCanvas" width="1000" height="500" class="draw"></canvas>
    <script>
        var testCanvas = document.getElementById("testCanvas");
        // 获取getContext()对象
        var context = testCanvas.getContext("2d");
 
        context.fillStyle = "red";
        context.fillRect(10, 10, 150, 150);
        // 保存状态(红色)
        context.save();
 
        context.fillStyle="green";
        context.fillRect(150, 150, 170, 170);
        // 保存状态(绿色)
        context.save();
 
        // 恢复状态(红色)
        context.restore();
        context.fillRect(250, 250, 170, 170);
 
        // 恢复状态(绿色)
        context.restore();
        context.fillRect(380, 380, 170, 170);
        context.beginPath();
    </script>
</body>
</html>

效果图

Canvas动画制作实例

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>HTML5学堂</title>
    <link rel="stylesheet" href="../css/reset.css">
    <script src="../js/jquery-1.8.3.min.js" charset="utf-8" type="text/javascript"></script>
    <style>
        .wrap {
            width: 1024px;
            height: 800px;
            margin: 0 auto;            
        }
        .wrap canvas {
            border: 1px solid #999;
        }
    </style>
</head>
<body>
    <div class="wrap">
        <canvas width="1024" height="600">
            您的浏览器不支持canvas!
        </canvas>    
    </div>
    <script>
        var testCanvas = $("canvas")[0];
        var context = testCanvas.getContext("2d");
        var x = 0;
        var y = 0;
        var timer = null;
 
        // 思路:进行清画布 再次绘制(循环操作)
 
        /*
         * 功能:Canvas动画绘制
         * author:HTML5学堂、刘国利、陈能堡
         *
         */
        function draw(){
            // 不断改变绘制对象的水平位置
            x++;
            // 清除画布
            context.clearRect(0, 0, 1024, 600);
            context.beginPath();
            context.fillStyle = "red";
            context.arc(x, 150, 100, 0, 2 * Math.PI, true);
            context.closePath();
            // 绘制轮廓
            context.stroke();
            // 填充颜色
            context.fill();
        }
 
        // 设置计时器
        setInterval(draw, 20);
    </script>
</body>
</html>

效果图

原文发布于微信公众号 - HTML5学堂(h5course-com)

原文发表时间:2015-08-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4055
来自专栏芋道源码1024

熔断器 Hystrix 源码解析 —— 断路器 HystrixCircuitBreaker

本文主要基于 Hystrix 1.5.X 版本 1. 概述 2. HystrixCircuitBreaker 3. HystrixCircuitBreaker....

5377
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

4878
来自专栏飞扬的花生

jsencrypt参数前端加密c#解密

      写程序时一般是通过form表单或者ajax方式将参数提交到服务器进行验证,如何防止提交的请求不被抓包后串改,虽然无法说绝对安全却给非法提交提高了难度...

3919
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2627
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2727
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

5676
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

32510
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2892
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2626

扫码关注云+社区