本系列文章代码文件

前面的章节我们介绍了许多基本的动画,在本节我们将使用这些基本的动画来创建一些高级动画。今天我们介绍的第一个高级动画叫做缓动动画(ease),也许在写css动画的时候已经接触过 ease 这个概念。但我们今天要介绍的是如何在canvas中实现这样的动画效果。本章主要内容:

  1. 百分比运动的概念

  2. 定点缓动动画

  3. 非定点缓动动画

  4. 只能用在运动中吗

1.百分比运动

百分比运动的概念是我们讲解缓动动画,包括下一节弹性动画的核心。这两个动画的核心概念都是基于百分比运动,只是作用的物理元素不同。这里我们把概念都一起介绍了,下一节就可以直接上菜。

缓动动画弹性动画这两种动画,都是让一个物体从当前位置移动到一个我们设定的目标位置。在缓动动画中,物体是由快到慢的滑行到目标位置,然后停止。在弹性动画中,物体运动到目标位置的时候,并不会立刻停止而是以目标位置为中心点做一个类似弹簧的往复运动,最终会停止在目标位置。为了让大家有个更直观的认识,来两张动图。

缓动动画(easing)

弹性动画(spring)

两种动画都有着一样的流程:

  1. 设置目标位置

  2. 计算到目标位置的距离

  3. 根据距离百分比计算速度或加速度

这两种动画唯一的不同是:缓动动画中,距离的百分比作用于速度,物体距离目标位置越远,运动的速度就越大,随着物体距离目标位置越来越近,速度逐渐降低为零,停止在目标位置。弹性动画中,距离的百分比作用于加速度,同样是距离目标位置越远,加速度越大,随着距离越来越近,加速度最终为零。

2. 定点缓动动画

在上图的缓动动画中我们可以看到,小球运动到目标位置的速度,有一个由快到慢的过程。这里我们是怎样实现的呢?其实原理很简单:

easing就是我们设定的缓动参数,每一帧都乘以距离,随着距离的不断减小,速度也就不断减小。光说不练假把式,上代码:

    <canvas id="canvas" width="500" height="500" style="background-color: #000;"></canvas><script type="text/javascript" src="../js/utils.js"></script><script type="text/javascript" src="../js/ball.js"></script><script type="text/javascript">window.onload = function(){var canvas = document.getElementById('canvas'),context = canvas.getContext('2d');var ball = new Ball(20, "red"), easing = 0.05,  //设置缓动参数targetX = canvas.width/2; //设定目标位置ball.y = canvas.height/2;(function drawFrame(){window.requestAnimationFrame(drawFrame, canvas);context.clearRect(0, 0, canvas.width, canvas.height);//速度计算//随着ball.x的增大, (targetX - ball.x)的值不断减小, 导致vx不打断减小var vx = (targetX - ball.x)*easing;ball.x += vx;ball.draw(context);}())}</script>

效果图这里就不上了,和上面展示的一样。这里只是展示了水平方向的运动,你也可以加上竖直方向或者任意的目标位置:

var targetX = 任意位置;
var targetY = 任意位置;

然后再动画循环中:

    var vx = (targetX - ball.x)*easing; var vy = (targetY - ball.y)*easing;

ok,我们就可以得到向任意位置运动的缓动动画了!是不是很简单。

当然,这里还有个问题。为了提升动画的性能,在这里我们可以做个条件限制。在动画循环里:

    var stopAni = window.requestAnimationFrame(drawFrame, canvas);...var dx = targetX - ball.x;if(Math.abs(dx)<1){ball.x = canvas.width/2;//停止动画window.cancelAnimationFrame(stopAni);}else{var vx = dx*easing;ball.x += vx;}...

3.非定点缓动动画

说到非定点缓动动画,你有没有想到在前几章里讲到的跟随鼠标运动的箭头啊!好吧,可怜的鼠标我们这次又要用到你了。我们让鼠标的位置作为我们的目标位置(target),然后让小球做缓动动画,看看能出现什么样精彩的效果.

看这个动画看上去是比不是跟家的平滑有质感呢?(原谅我,我也不知道质感是个什么鬼!!!),上代码:

  window.onload = function(){var canvas = document.getElementById('canvas'),context = canvas.getContext('2d');var mouse = utils.captureMouse(canvas); //捕获鼠标位置var ball = new Ball(20, "red");var vx, vy, easing=0.05; //设定缓动参数(function drawFrame(){window.requestAnimationFrame(drawFrame, canvas);context.clearRect(0, 0, canvas.width, canvas.height);vx = (mouse.x - ball.x)*easing; //一样样的vy = (mouse.y - ball.y)*easing; //一样样的ball.x += vx;ball.y += vy;ball.draw(context);}())}

是不是赶脚有点过于简单了呢?我们来个难点的,再来一个小球,让它跟着前一个小球走。效果图是这样的:

代码呢我这里就不例出来了,因为炒鸡简单!!!只要改改上面的代码就可以了。

4. 只能用在运动中吗

缓动动画只能用在运动中吗?这肯定是不可嗯那个的啦。为了让你更好的理解,这里我们举几个缓动动画用在其他方面的例子

1.旋转(Rotation)

设定当前旋转速度和目标旋转速度。当然这里我们要引入一些物体,比如我们以前用过的箭头Arrow.

var rotation = 90,targetRotation = 270;//then ease it:
rotation += (targetRotation - rotation) * easing;
arrow.rotation =  rotation * Math.PI / 180;
2.颜色(Colors)

设定初始的颜色值

var red = 255,green = 0,blue = 0,redTarget = 0,greenTarget = 0,blueTarget = 255;

然后在drawFrame中,easing it:

red += (redTarget -red) * easing;
green += (greenTarget -green) * easing;
blue += (blueTarget -blue) * easing;

然后把这三个值转换为一个16进制的值:

var color= red << 16 | green  << 16 | blue
2.透明度(Transparency)

设定透明度:

var alpha = 0,targetAlpha = 1;//动画循环中alpha += (targetAlpha - alpha) * easing;
ball.color = "rgba(255, 0, 0," + alpha + ");

ok,本章内容就到这里了,更多高级缓动动画看这里 https://github.com/lamberta/html5-animation。缓动动画的原理及使用方法已经告诉你了,能创造出什么样amazing的动画就看你的想象力了。

下一节,我们将弹性动画,敬请期待!!!

11、《每周一点canvas动画》——缓动动画相关推荐

  1. 背水一战 Windows 10 (15) - 动画: 缓动动画

    背水一战 Windows 10 (15) - 动画: 缓动动画 原文:背水一战 Windows 10 (15) - 动画: 缓动动画 [源码下载] 背水一战 Windows 10 (15) - 动画: ...

  2. SVG—初识3之SVG动画(缓动动画、时间轴线、时间交错)

    SVG-初识3 SVG动画 使用GSAP制作动画 缓动动画 时间轴线 时间交错 SVG动画 Transform(scale.rotate.translate .skew) 路径动画 (path) 描边 ...

  3. 匀速动画VS缓动动画(超详细)

    文章目录 匀速动画 匀速动画案例描述 匀速动画案例图示 HTML+CSS 匀速动画JS代码 匀速动画JS代码改进----函数封装 缓动动画 缓动动画案例描述 缓动动画案例图示 HTML+CSS 缓动动 ...

  4. 10、《每周一点canvas动画》——移动物体(2)

    本系列文章代码文件 在上一节<每周一点canvas动画>--移动物体(1)中我们介绍了如何捕获一个物体,并且对物体进行拖拽.首先,我们在小球的原型对象上添加了一个方法getBounds() ...

  5. 7、《每周一点canvas动画》——边界检测与摩擦力(1)

    本章已经是<Canvas 动画系列>动画的第七篇了,我保证这一章不会再有难的数学公式和物理概念.鉴于有的同学并不是从第一章开始看这个系列,我将会把本文所用到的一些 类文件 和 工具函数 文 ...

  6. 《每周一点canvas动画》——圆周运动

    接<每周一点canvas动画>--波形运动 圆周运动可以分为两种基本的形式:正圆运动和椭圆运动. 在讲解圆周运动之前,必不可少的数学公式即将袭来.so,各位骚年们,请护好自己的膝盖.听不懂 ...

  7. canvas系列教程07 ——捕获、拖拽、抛掷、缓动动画、弹性动画

    捕获物体 多边形以及不规则图形的捕获非常复杂,采用的方法是分离轴定理(SAT)和最小平移向量(MTV).这里不展开介绍,有兴趣的小伙伴可以自行搜索了解一下.下面来介绍一下矩形和圆的捕获. 矩形的捕获 ...

  8. 19、《每周一点canvas动画》——桌球运动(1)

    每周一点canvas动画代码文件 一本好的技术书籍往往都是由浅入深,本系列文章基本上也遵循这个原理.在上一章中我们介绍了高级的坐标旋转,并且通过它,我们实现了任意角度的碰撞反弹效果,它让物体与非水平和 ...

  9. vpython 做圆周运动_《每周一点canvas动画》——圆周运动

    接<每周一点canvas动画>--波形运动 圆周运动可以分为两种基本的形式:正圆运动和椭圆运动. 在讲解圆周运动之前,必不可少的数学公式即将袭来.so,各位骚年们,请护好自己的膝盖.听不懂 ...

最新文章

  1. 23张图!万字详解「链表」,从小白到大佬!
  2. 低功耗设计——功耗估算
  3. LightOJ-1220 Mysterious Bacteria (素数打表+欧几里得算法+唯一分解定理)给出x,求x=a^p,最大的指数
  4. Linux安装配置apache
  5. 省份城市区县三级联动html代码,基于Jquery实现省份、城市、区县三级联动
  6. wing ide 3.x 中文设置
  7. 二叉树三种遍历非递归算法
  8. 斐讯K1K2刷机固件教程!最新最全整理版!(小米路由、newifi通用)
  9. 如何断开计算机连接的打印机,打印机无线连接断开了怎么办
  10. 利用python分析微信聊天记录
  11. C++实现的BP神经网络(代码与详解)
  12. 怎么快速学习Python
  13. Effective Java 泛型 第28条:利用有限制通配符来提升API的灵活性
  14. 软件测试面霸的修炼心经
  15. 【Linux】socket地址、IP地址、Port端口转换
  16. 什么是真正的爱情?(经典)
  17. BTree,B-Tree,B+Tree,B*Tree都是什么
  18. 背景平铺两栏自适应(占满剩余高度)fastclick、IScroll双飞翼布局
  19. css3最新版中文参考手册在线浏览
  20. 10大免费的白嫖网站

热门文章

  1. javascript 中怎么判断为数字类型
  2. 奥比中光深度摄像头_奥比中光深度摄像头NiViewer.exe
  3. Android 修改应用中的字体
  4. 东软睿道-Java高级应用编程
  5. 联想和戴尔的渠道之争
  6. sql截取字符串后面四位
  7. STM32F429通用定时器(TIM)
  8. 疑论:对阿里巴巴的投资该歇手了
  9. 抖音电商,向全域兴趣电商迈进一步
  10. 红外相机:巨哥红外MAG32产品介绍