canvas动画简单操作

canvas动画

小球滚动效果

关键api:
window.requestAnimationFrame(draw)
会递归调用draw函数,替代setIntervalvar x = 20;
var speed = 4;
//电脑的帧率是1秒钟60Hz, 就相当于一秒钟可以播放60张图片,就相当于播放一张图片使用16.7msfunction draw () {//1. 先把画布清空context.clearRect(0, 0, canvas.width, canvas.height);//2. 画小球context.beginPath();var gradient = context.createRadialGradient(x-10,190,0,x,200,20);gradient.addColorStop(0,'#fff');gradient.addColorStop(1,'#333');context.fillStyle = gradient;context.arc(x, 200, 20, 0, 2*Math.PI);context.fill();//3. x要移动x  = speed;if(x>canvas.width - 20||x<20){speed = -speed;}//被优化过的动画执行方向1.递归调用;2.可以自适应浏览器的刷新的帧率window.requestAnimationFrame(draw);
}
draw();

小球x,y轴回弹效果

关键点:
1.  跟上面例子差不多
2.  在y轴上加多一个speed即可var xspeed = 2;
var yspeed = 2;
//小球的初始位置
var x = 20;
var y = 200;
function draw() {context.clearRect(0, 0, canvas.width, canvas.height);//创建一张新的玻璃纸context.beginPath();var gradient = context.createRadialGradient(x - 10, y-10, 0, x, y, 20);gradient.addColorStop(0, '#fff');gradient.addColorStop(1, '#333');context.fillStyle = gradient;context.arc(x, y, 20, 0, 2*Math.PI);context.fill();x  = xspeed;y  = yspeed;//水平方向到达了边界, 就调头, 速度往反方向if (x < 20 || x > canvas.width - 20) {xspeed = -xspeed;}if (y < 20 || y > canvas.height - 20) {yspeed = -yspeed;}window.requestAnimationFrame(draw);
}
draw();

小鸟挥动翅膀

var birdsImg = new Image();
birdsImg.src = "./img/birds.png";//图片加载完成之后,才开始执行绘制操作
birdsImg.onload = function () {//翅膀扇了第几次var index = 0;//当前是第几张图片var xindex = 0;//每张小鸟图片的宽高var w = birdsImg.width / 3;var h = birdsImg.height;//小鸟的位置var x = 100;var y = 100;//小鸟往下掉的速度var yspeed = 5;function draw() {//使用第几张图片index  = 1;xindex = index % 3;//清空画布context.clearRect(0, 0, canvas.width, canvas.height);//画每一张小鸟context.drawImage(birdsImg, xindex * w, 0, w, h, x, y, w, h);//小鸟往下掉y  = yspeed;//递归调用draw方法,实现动画window.requestAnimationFrame(draw);}draw();
}

地球转动

判断两张图片都加载完成的方法

var sun = new Image();
var earth = new Image();
sun.src = "./img/Canvas_sun.png";
earth.src = "./img/Canvas_earth.png";//计数器
var count = 0;
var images = [sun, earth];//如果需要多个图片都加载完成之后,再操作, 应该怎么办:
images.forEach(function (img) {img.onload = function () {count  = 1;if (count == images.length) {//。。。code}   

地球转动

var sun = new Image();
var earth = new Image();
sun.src = "./img/Canvas_sun.png";
earth.src = "./img/Canvas_earth.png";
//计数器
var count = 0;
var images = [sun, earth];
//如果需要多个图片都加载完成之后,再操作, 应该怎么办:
images.forEach(function (img) {img.onload = function () {count  = 1;if (count == images.length) {console.log("所有的图片都加载完成了");function draw() {//0. 先把原始的坐标系的状态保存起来context.save();//1. 清空画布context.clearRect(0, 0, canvas.width, canvas.height);//2. 画太阳(五参模式, 原图显示)context.drawImage(sun, 0, 0, sun.width, sun.height);//3. 假设地球绕太阳一圈的时间是1分钟,只需要拿到当前的秒数,就可以用秒数/60*360计算出地球相于水平线的角度//拿到当前的秒数var now = new Date();//精确到毫秒,就能够形成一个连续的动画效果了var seconds = now.getSeconds();var millSeconds = now.getMilliseconds();seconds  = millSeconds / 1000;//算出此时此刻的地球的角度(弧度)var radian = seconds / 60 * 2 * Math.PI;//4. 平移坐标系,将坐标的原点移到太阳的中心context.translate(sun.width/2, sun.height/2);//5. 旋转坐标系context.rotate(radian);//6. 画地球context.drawImage(earth, 120-earth.width/2, -earth.height/2, earth.width, earth.height);//7. 还原坐标系context.restore();window.requestAnimationFrame(draw);}draw();}}
})


关于save和restore

//save保存, restore恢复, 还原
//save的作用,是把context的当前的状态,保存起来;restore是把context最近一次保存的状态还原context.fillStyle = "red";
context.strokeStyle = "blue";
context.shadowColor = "cyan";//把当前的context整个保存一份
context.save(); //就会把当前的context整个保存一份context.fillRect(100, 100, 100, 100);context.fillStyle = "green";
context.fillRect(300, 200, 100, 100);//把最近保存的那个context直接拿过来用
context.restore();context.fillRect(500, 300, 100, 100);

钟表的实现

//画某一帧的方法
function draw() {//0. 把坐标系的原始状态保存context.save();//1. 清空画布context.clearRect(0, 0, canvas.width, canvas.height);//2. 先平移坐标系到中心点,再旋转坐标系到12点钟的方向context.translate(300, 200);//往反方向旋转90度context.rotate(-0.5*Math.PI);//3. 画表盘context.beginPath();context.arc(0, 0, 130, 0, 2*Math.PI);context.strokeStyle = "blue";context.lineWidth = 3;context.stroke();//4. 画时针的刻度context.beginPath();for (var i = 0; i<12; i  ) {context.moveTo(115, 0);context.lineTo(126, 0);context.rotate(30/180*Math.PI);}context.strokeStyle = "#000";context.lineWidth = 6;context.stroke();//5. 画分针的刻度context.beginPath();for (var i = 0; i<60; i  ) {if (i % 5 != 0) {context.moveTo(120, 0);context.lineTo(126, 0);}context.rotate(6/180*Math.PI);}context.lineWidth = 4;context.stroke();//6. 算出时针, 分针, 秒针的角度var now = new Date();var h = now.getHours();var m = now.getMinutes();var s = now.getSeconds();m = m   s/60; //精确到几点几分钟h = h   m/60; //精确到几点几小时var hradian = h / 12 * 2 * Math.PI;var mradian = m / 60 * 2 * Math.PI;var sradian = s / 60 * 2 * Math.PI;//7. 画时针context.save();context.beginPath();context.rotate(hradian);context.moveTo(-15, 0);context.lineTo(60, 0);context.strokeStyle = "blue";context.lineWidth = 6;context.lineCap = "round";context.stroke();context.restore();//8. 画分针context.save();context.beginPath();context.rotate(mradian);context.moveTo(-15, 0);context.lineTo(70, 0);context.strokeStyle = "blue";context.lineWidth = 5;context.lineCap = "round";context.stroke();context.restore();//9. 画秒针context.save();context.beginPath();context.rotate(sradian);context.moveTo(-15, 0);context.lineTo(85, 0);context.strokeStyle = "red";context.lineWidth = 3;context.lineCap = "round";context.stroke();context.restore();//10. 画表心context.beginPath();context.arc(0, 0, 5, 0, 2*Math.PI);context.fillStyle = "red";context.fill();//11. 还原坐标系context.restore();
}//draw();//没有必要使用requestAnimationFrame,因为这个钟表是一秒钟走一次
setInterval(draw, 1000);

更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编译相关

编译的过程 &#xff1a; 1. 词法分析&#xff0c;程序被扫描成&#xff1a;关键字&#xff0c;标识符&#xff0c;字面量和特殊符号这些记号。 2. 语法分析&#xff0c;对记号进行语法分析产生语法树。&#xff08;代码最终由表达式组合&#xff09; 3. 语义分析&#xff0c;经…

带有Swagger的Spring Rest API –创建文档

使REST API易于使用的真正关键是好的文档。 但是&#xff0c;即使您的文档做得不错&#xff0c;您也需要设置公司流程的权利&#xff0c;以正确&#xff0c;及时地发布它。 确保利益相关者按时收到是一回事&#xff0c;但是您也要负责API和文档中的更新。 自动完成此过程可轻松…

关于React-native的介绍以及环境搭建

React-Native介绍&#xff08;后面内容的RN就是指react-native&#xff09; 由facebook公司推出的&#xff0c;基于react&#xff0c;能开发原生app 原理&#xff1a; 1. 利用react框架写好js代码 2. 利用python、C 把我们的js代码&#xff0c;翻译成java代码 3. 利用andr…

别说我不会玩,我来告诉你iPhone有多烂!iPhone缺点集

港行iPhone4S入手&#xff0c;帮朋友整的。朋友经常出国&#xff0c;所以指定要越狱&#xff0c;装墙外软件。 大sim卡是不支持的&#xff0c;还好商家给了剪卡器。首先发现移动卡不支持&#xff0c;别告诉我欢迎门&#xff0c;我用的就是19位的ICCID&#xff0c;反正把卡装进去…

使用PrimeFaces开发数据导出实用程序

我的日常工作涉及大量使用数据。 我们使用关系数据库来存储所有内容&#xff0c;因为我们依赖于企业级的数据管理。 有时&#xff0c;具有将数据提取为简单格式&#xff08;例如电子表格&#xff09;的功能很有用&#xff0c;以便我们可以按需进行操作。 这篇文章概述了我使用P…

函数名和变量名重名问题

1.如果输出一个函数名&#xff0c;那么输出的就是这个函数的代码。 function test(){console.log("哈哈");}console.log(test); 2.如果变量名 和函数名 重名会怎么样&#xff1f; //a.如果变量有值&#xff0c;那么输出的就是变量的值。//b.如果变量没有值&#xff…

css3 transition的应用

css3 的transition&#xff1a;允许css属性值在一定的时间区内平滑的过渡。 transition-property&#xff1a;变换延续的时间 transition-duration&#xff1a;在延续时间段 transition-timing-function&#xff1a;变换速度变化 transition-delay&#xff1a;变化延迟时间 a&a…

break和continue的区别

break 1.break 语句可用于跳出循环。 2.break所在的循环体已经结束。 continue 1.continue 语句中断循环中的迭代&#xff0c;如果出现了指定的条件&#xff0c;然后继续循环中的下一个迭代。 2.continue所在的循环体并没有结束。 demo演示 for (i0;i<5;i ){if (i3) br…

Tomcat到Wildfly:配置数据库连接

此摘录摘自《 从Tomcat到WildFly 》一书&#xff0c;您将在其中学习如何将现有的Tomcat体系结构移植到WildFly&#xff0c;包括服务器配置和在其顶部运行的应用程序。 WildFly是完全兼容的Java Enterprise Edition 7容器&#xff0c;与Tomcat相比&#xff0c;它具有更多的可用…

我的开始

今天是我第一天写在博客园写东西&#xff0c;怎么说呢&#xff0c;刚毕业 正着工作呢。一头雾水 不知道怎么办&#xff0c;就从同学那里拷了分简历&#xff0c;也学着写了一份。自己还算满意。不过呢 在智联上投了40多家单位了&#xff0c;只有一家让电话面试。有点不值所错&am…

js 深拷贝和浅拷贝

js 深拷贝和浅拷贝 先举一下项目中遇到的两个例子&#xff1a; 例子1&#xff1a; var json $.parseJSON(data.data); //data.data是后台返回的值 var a json.channels; var b json.channels; console.log(ab)//true 这个例子是浅拷贝&#xff0c;a、b两个对象是完…

在jOOQ之上构建的RESTful JDBC HTTP服务器

jOOQ生态系统和社区正在持续增长。 我们个人总是很高兴看到基于jOOQ构建的其他开源项目。 今天&#xff0c;我们非常高兴为您介绍BjrnHarrtell结合REST和RDBMS的一种非常有趣的方法。 BjrnHarrtell从小就是瑞典的程序员。 他通常在Sweco Position AB上忙于编写GIS系统和集成&a…

Tiny Wings 为什么能迅速成为 iOS App Store 付费应用第一名?

Tiny Wings 不知是有意无意&#xff0c;完美的利用了人的性意识。有节奏感的上上下下&#xff0c;找准G点后毫不犹豫的迎头猛扎下去。期待自己拥有绝佳技巧&#xff0c;不放过任何一次能high起来的机会。飞上天触到云的瞬间high得全身淋漓畅快&#xff0c;连续多触云几次基本上…

node.js 搭建http调取 mysql数据库中的值

首先&#xff0c;我们先在数据库中创建两个表t_news,t_news_type;插入数据&#xff1a; 然后我们再写代码&#xff1a; //加载模块express var express require("express"); var fs require("fs"); //加载路径 var url require("url"); //加…

Spring Caching抽象和Google Guava Cache

Spring为缓存昂贵的方法调用提供了强大的开箱即用支持。 这里详细介绍了缓存抽象。 我的目的是要介绍Spring现在为框架的4.0版本提供的较新的缓存实现之一-使用Google Guava Cache 简而言之&#xff0c;请考虑一种具有几种慢速方法的服务&#xff1a; public class DummyBoo…

NHibernate.3.0.Cookbook第三章第9节的翻译

Using stateless sessions 使用无状态会话 当进行大量数据处理的时候,可能会放弃使用一些高级特性,而使用更接近底层的API来提高性能.在NHibernate中,这种高性能的底层API就是无状态的会话.本节介绍如何使用无状态会话来更新movie对象的价格. 准备 使用第一章的Eg.Core和第二章…

致电以验证您的JavaFX UI的响应能力

最近&#xff0c;Jim Weaver在他的Surface Pro上为演示安装了我的小图片索引应用“ picmodo”&#xff0c;并且GUI变成了垃圾。 显然&#xff0c;Windows Tablet上JavaFX的基本字体大小很高&#xff1a; 我认为&#xff0c;即使调整大小行为和预期一样工作&#xff0c;UI也绝…

上周热点回顾(7.9-7.15)

热点随笔&#xff1a; 2012五大主流浏览器 HTML5 和 CSS3 兼容性大比拼&#xff08;梦想天空&#xff08;山边小溪&#xff09;&#xff09; 原创&#xff1a;让密码不再被遗忘 - 在web中尝试图形口令&#xff01;&#xff08;网无忌&#xff09; 构建一个Outlook风格漂亮界面…

vuex 管理vue-router的传值

假设有这样的一种情况&#xff0c;在两个组件中。一个组件【A】主要是比如说放表格数据&#xff0c;而另外一个组件【B】是专门用来向组件A的表格添加数据的表单。这个时候就是两个兄弟组件之间传递数据了。首先想到的是使用兄弟组件传递数据的方法&#xff1a; 新建一个中间件…

命令行下使用curl,采集数据遇到的问题。

前几天遇到这样一个问题&#xff0c;写了一段php采集程序&#xff0c;里面用到了curl_init()等&#xff0c;在浏览器里可以获得数据&#xff0c;但在命令行里不可以用的php环境是wamp&#xff0c;加载了php_curl&#xff0c; php.ini文件里面加载的&#xff0c;打印phpinfo 也显…