HTML5 Canvas draw方法制作动画效果示例


Posted in HTML / CSS onJuly 11, 2013

HTML5 Canvas动画效果演示
主要思想:
首先要准备一张有连续帧的图片,然后利用HTML5 Canvas的draw方法在不同的时间间隔绘制不同的帧,这样看起来就像动画在播放。
关键技术点:
JavaScript 函数setTimeout()有两个参数,第一个是参数可以传递一个JavaScript方法,
另外一个参数代表间隔时间,单位为毫秒数。代码示例:
setTimeout( update, 1000/30);
Canvas的API-drawImage()方法,需要指定全部9个参数:
ctx.drawImage(myImage, offw, offh, width,height, x2, y2, width, height);
其中offw, offh是指源图像的起始坐标点,width, height表示源图像的宽与高,x2,y2表
示源图像在目标Canvas上的起始坐标点。
一个22帧的大雁飞行图片实现的效果:
HTML5 Canvas draw方法制作动画效果示例 
源图像:
HTML5 Canvas draw方法制作动画效果示例 
程序代码:

复制代码
代码如下:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="chrome=IE8">
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Canvas Mouse Event Demo</title>
<link href="default.css" rel="stylesheet" />
<script>
var ctx = null; // global variable 2d context
var started = false;
var mText_canvas = null;
var x = 0, y =0;
var frame = 0; // 22 5*5 + 2
var imageReady = false;
var myImage = null;
var px = 300;
var py = 300;
var x2 = 300;
var y2 = 0;
window.onload = function() {
var canvas = document.getElementById("animation_canvas");
console.log(canvas.parentNode.clientWidth);
canvas.width = canvas.parentNode.clientWidth;
canvas.height = canvas.parentNode.clientHeight;
if (!canvas.getContext) {
console.log("Canvas not supported. Please install a HTML5 compatible browser.");
return;
}
// get 2D context of canvas and draw rectangel
ctx = canvas.getContext("2d");
ctx.fillStyle="black";
ctx.fillRect(0, 0, canvas.width, canvas.height);
myImage = document.createElement('img');
myImage.src = "../robin.png";
myImage.onload = loaded();
}
function loaded() {
imageReady = true;
setTimeout( update, 1000/30);
}
function redraw() {
ctx.clearRect(0, 0, 460, 460)
ctx.fillStyle="black";
ctx.fillRect(0, 0, 460, 460);
// find the index of frames in image
var height = myImage.naturalHeight/5;
var width = myImage.naturalWidth/5;
var row = Math.floor(frame / 5);
var col = frame - row * 5;
var offw = col * width;
var offh = row * height;
// first robin
px = px - 5;
py = py - 5;
if(px < -50) {
px = 300;
}
if(py < -50) {
py = 300;
}
//var rate = (frame+1) /22;
//var rw = Math.floor(rate * width);
//var rh = Math.floor(rate * height);
ctx.drawImage(myImage, offw, offh, width, height, px, py, width, height);
// second robin
x2 = x2 - 5;
y2 = y2 + 5;
if(x2 < -50) {
x2 = 300;
y2 = 0;
}
ctx.drawImage(myImage, offw, offh, width, height, x2, y2, width, height);
}
function update() {
redraw();
frame++;
if (frame >= 22) frame = 0;
setTimeout( update, 1000/30);
}
</script>
</head>
<body>
<h1>HTML Canvas Animations Demo - By Gloomy Fish</h1>
<pre>Play Animations</pre>
<div id="my_painter">
<canvas id="animation_canvas"></canvas>
</div>
</body>
</html>

发现上传透明PNG格式有点问题,所以我上传不透明的图片。可以用其它图片替换,替换以后请修改最大帧数从22到你的实际帧数即可运行。
HTML / CSS 相关文章推荐
纯css3制作网站后台管理面板
Dec 30 HTML / CSS
html5服务器推送_动力节点Java学院整理
Jul 12 HTML / CSS
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
Jan 05 HTML / CSS
用html5的canvas画布绘制贝塞尔曲线完整代码
Aug 14 HTML / CSS
浅谈利用缓存来优化HTML5 Canvas程序的性能
May 12 HTML / CSS
HTML5通用接口详解
Jun 12 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
Dec 15 HTML / CSS
canvas中普通动效与粒子动效的实现代码示例
Jan 03 HTML / CSS
Canvas环形饼图与手势控制的实现代码
Nov 08 HTML / CSS
前端使用canvas生成盲水印的加密解密的实现
Dec 16 HTML / CSS
HTML5 新增内容和 API详解
Nov 17 HTML / CSS
css3应用示例:新增的选择器
Mar 16 HTML / CSS
HTML5验证以及日期显示的实现详解
Jul 05 #HTML / CSS
html标签之Object和EMBED标签详解
Jul 04 #HTML / CSS
HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)
Jul 04 #HTML / CSS
HTML5 Canvas鼠标与键盘事件demo示例
Jul 04 #HTML / CSS
HTML5 Canvas的性能提高技巧经验分享
Jul 02 #HTML / CSS
html5 CSS过度-webkit-transition使用介绍
Jul 02 #HTML / CSS
仿CSDN Blog返回页面顶部功能实现原理及代码
Jun 30 #HTML / CSS
You might like
PHP实现微信红包金额拆分试玩的算法示例
2018/04/07 PHP
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
颜色选择器 Color Picker,IE,Firefox,Opera,Safar
2010/11/25 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
jQuery 插件仿百度搜索框智能提示(带Value值)
2013/01/22 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
JavaScript原生数组Array常用方法
2017/04/06 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
微信小程序-getUserInfo回调的实例详解
2017/10/27 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
vue项目部署上线遇到的问题及解决方法
2018/06/10 Javascript
详解vue中组件参数
2018/07/09 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
jquery 时间戳转日期过程详解
2019/10/12 jQuery
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
Vue router传递参数并解决刷新页面参数丢失问题
2020/12/02 Vue.js
Python中常用信号signal类型实例
2018/01/25 Python
基于Python+Appium实现京东双十一自动领金币功能
2019/10/31 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
Python grpc超时机制代码示例
2020/09/14 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
Foot Locker意大利官网:全球领先的运动鞋和服装零售商
2017/05/30 全球购物
社会实践感言
2014/01/25 职场文书
寒假家长评语大全
2014/04/16 职场文书
党员承诺书范文2015
2015/04/27 职场文书
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
Python turtle编写简单的球类小游戏
2022/03/31 Python