说好的缓动呢?

jQuery的缓动函数不给力,被逼自己写一个,既然要写,先把需求列好:

1. 动画类型有:linear, easeIn, easeOut, easeInOut

2. 可以在缓动过程中改变属性,也可以是调用函数,并改变函数的参数(后者是我的初衷,jq只支持属性,见 当0碰上0 )

 

动画是怎样产生的?学过Flash的人应该知道帧,帧就是一个画面,通常一秒25帧,也就一秒播放25个画面,如此快速的放过去,静态也成了动态(当然,前提是25个画面不是同一个画面,囧。。。)

 

难道做动画要画N多图,好吧,这叫“逐帧动画”,如果你很闲大可以这么干,因为这样做的效果绝对是顶级的,毫无瑕疵的。但是我一点都不闲,我画画的水平连幼儿园都教不了,所以这条路可以直接枪毙。

 

接下来进入正题,Flash中还有关键帧的概念,举个例子,关键帧A,物体box的宽高为100,关键帧B,box的宽高为50,A与B之间有25帧,接着我们从A播放到B,效果就是box在1秒内不断缩小,这叫“补间动画”。
 

这里涉及到三个东西:动画对象(box),动画属性(width, height),动画时间(1秒)

我们要做的事就是在某个时间点确定动画属性的值

 

常见的动画有四种类型,介绍一下:

          linear:线性动画,即匀速

        easeIn:速度从小到大,即淡入

    easeOut :速度从大到小,即淡出

  easeInOut:开始时速度从小到大,结束时速度从大到小,即淡入淡出
 

====================下面这段爱看不看,估计看着挺无聊的===========================

其实说到缓动,就不得不提Robert Penner,他发明了N多缓动公式,举个例子

1
2
3
4
5
6
7
8
9
10
/**
 * @param t 用掉的时间
 * @param b 初始值
 * @param c 总变化量,比如x的初始值为0,结束值为100,变化量就是100
 * @param d 动画总时长
 * @return 当前属性值
 */
function linear(t, b, c, d){
    return c * t / d + b;
}

我还是解释一下吧:

  设当前变化量为X,则

  t / d = X / c,所以X = c * t / d,然后X + b就可以获得当前属性值
 

再看一个稍复杂的:

1
2
3
var easeInQuad =  function(t, b, c, d){
    return c * ( t /= d ) * t + b;
}

这个有淡入效果,也就是说动画开始时,值的变化量从小到大。

可以发现两者唯一的区别就是 t / d 和 (t /= d) * t,刚才说了t / d是一个>=0 && <=1的比值,暂取名为a,而(t /= d) * t就相当于Math.pow(a, 2)。
 

为什么要平方呢?

1. 首先a >= Math.pow(a, 2)是肯定的

2. 每次调用函数时,t / d 这个比值也是匀速变大的,比如第1次调用时是0.1(平方0.01),第2次调用时是0.2(平方0.04)等,那第10次调用时,肯定是1没错吧,这时候 c * 1 + b,动画就到此结束了

3. 第2点证明了比值越小,值的变化量就越小,比值越大,值的变化量就越大,如果不用平方而是三次方,那淡入效果就更明显了。

 

举个两个例子,可以看出一些规律,公式大体便是 当前属性值 = 总变化量 * 增量系数 + 初始值, 其中,增量系数根据不同算法各有不同。
 

====================继续往下看吧===========================
 

增量系数的算法,我就从 司徒正美 那拿过来用吧,他总结了一大堆,必须收藏啊!!

  

你会发现有Quad,Cubic,Quart之类的字眼,这些到底是啥意思呢,这里我给出Flash的Tweener 官方文档,一看便知了(如果下面是空白,表示在缓冲,为了看到这么好的演示,耐心等会吧)


根据上述知识点,我的动画函数便出炉了

  

posted @   越己  阅读(2956)  评论(33编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示