canvas动画

小球滚动效果

关键api:
window.requestAnimationFrame(draw)
会递归调用draw函数,替代setInterval var x = 20;
var speed = 4;
//电脑的帧率是1秒钟60Hz, 就相当于一秒钟可以播放60张图片,就相当于播放一张图片使用16.7ms function 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);

canvas动画简单操作的更多相关文章

  1. JavaScript动画基础:canvas绘制简单动画

    动画是将静止的画面变为动态的艺术.实现由静止到动态,主要是靠人眼的视觉残留效应.视觉残留也叫视觉暂留现象,物体在快速运动时, 当人眼所看到的影像消失后,人眼仍能继续保留其影像0.1~0.4秒左右的图像 ...

  2. 8个经典炫酷的HTML5 Canvas动画欣赏

    HTML5非常强大,尤其是Canvas技术的应用,让HTML5几乎可以完成所有Flash能完成的效果.本文精选了8个经典炫酷的HTML5 Canvas动画欣赏,每一个都提供全部的源代码,希望对你有所帮 ...

  3. 《FLASH CC 2015 CANVAS 中文教程》——1、导出canvas动画,文件结构浅析

    注::如果你对 FLASH 这个软件操作不够熟悉,建议你可以先看看FLASH动画之类的书. :FLASH CC 在文中直接简称为CC. :以下所以文章中所说的快捷键 如果你按了不起作用,请检查是否有其 ...

  4. [js高手之路] html5 canvas动画教程 - 实时获取鼠标的当前坐标

    有了前面的canvas基础之后,现在开始就精彩了,后面写的canvas教程都是属于综合应用,前面已经写了常用的canvas基础知识,参考链接如下: [js高手之路] html5 canvas系列教程 ...

  5. 【30分钟学完】canvas动画|游戏基础(1):理论先行

    前言 本文虽说是基础教程,但这是相对动画/游戏领域来说,在前端领域算是中级教程了,不适合前端小白或萌新.阅读前请确保自己对前端三大件(JavaScript+CSS+HTML)的基础已经十分熟悉,而且有 ...

  6. 《每周一点canvas动画》——3D点线与水波动画

    <每周一点canvas动画>--差分函数的妙用 每周一点canvas动画代码文件 好像上次更新还是十一前,这唰唰唰的就过去大半个月了,现在才更新实在不好意思.这次我们不涉及canvas 3 ...

  7. canvas基础简单易懂教程(完结,多图)

    目录 Canvas学习 一. Canvas概述 1.1 Hello world 1.2 Canvas的像素化 1.3 Canvas的动画思想 1.4 面向对象思维实现canvas动画 二.Canvas ...

  8. 学习笔记:HTML5 Canvas绘制简单图形

    HTML5 Canvas绘制简单图形 1.添加Canvas标签,添加id供js操作. <canvas id="mycanvas" height="700" ...

  9. HTML动画分类 HTML5动画 SVG库 SVG工具 Canvas动画工具

     1.js配合传统css属性控制,可以使用setTimeout或者高级的requestAnimationFrame 2.css3 3.svg 4.canvas(当然,这个还是要配合js)   也许这么 ...

随机推荐

  1. FormCollection获取请求数据

    public ActionResult Add(FormCollection fm) //通过FormCollection 对象获取表单数据 { string message = "&quo ...

  2. kvm之 virt-install工具命令详解

    一.virt-install是一个命令行工具,它能够为KVM.Xen或其它支持libvrit API的hypervisor创建虚拟机并完成GuestOS安装:此外,它能够基于串行控制台.VNC或SDL ...

  3. eas之缓存清理

    apusic缓存清理,安装web框架补丁后,先清空apusic缓存,然后再重启服务apusic-domains-server1-deploy-easweb-tmpfiles

  4. 【剑指Offer】9、变态跳台阶

      题目描述:   一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法.   解题思路:   当只有一级台阶时,f(1)=1:当有两级台阶时, ...

  5. [kuangbin带你飞]专题1-23题目清单总结

    [kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...

  6. linux配置Jdk1.8

    Jdk1.8:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html cd /usr/ ...

  7. open-ldap schema (2)

    schema介绍及用途 schema 是OpenLDAP 软件的重要组成部分,主要用于控制目录树中各种条目所拥有的对象类以及各种属性的定义,并通过自身内部规范机制限定目录树条目所遵循的逻辑结构以及定义 ...

  8. 33.bulk json格式的理解

    bulk json格式的理解 一.常规格式 按常规理解,bulk中json格式可以是以下方式 [{ "action": { }, "data": { } }] ...

  9. Educational Codeforces Round 35 B/C/D

    B. Two Cakes 传送门:http://codeforces.com/contest/911/problem/B 本题是一个数学问题. 有a个Ⅰ类球,b个Ⅱ类球:有n个盒子.将球放入盒子中,要 ...

  10. JavaScript基础的记录

    一.JavaScript的六种基本类型: 基本数据类型: String.Number.Boolean.Null.Undefined 引用数据类型: Object 二.强制类型转换: 主要指将其他的数据 ...