2016-12-14 14:40:55 +08:00

253 lines
5.5 KiB
JavaScript

/**
* Hilo
* Copyright 2015 alibaba.com
* Licensed under the MIT License
*/
/**
* @class Ease类包含为Tween类提供各种缓动功能的函数。
* @module hilo/tween/Ease
* @static
*/
var Ease = (function(){
function createEase(obj, easeInFn, easeOutFn, easeInOutFn, easeNoneFn){
obj = obj || {};
easeInFn && (obj.EaseIn = easeInFn);
easeOutFn && (obj.EaseOut = easeOutFn);
easeInOutFn && (obj.EaseInOut = easeInOutFn);
easeNoneFn && (obj.EaseNone = easeNoneFn);
return obj;
}
/**
* 线性匀速缓动函数。包含EaseNone函数。
*/
var Linear = createEase(null, null, null, null, function(k){
return k;
});
/**
* 二次缓动函数。包含EaseIn、EaseOut、EaseInOut三个函数。
*/
var Quad = createEase(null,
function(k){
return k * k;
},
function(k){
return - k * (k - 2);
},
function(k){
return ((k *= 2) < 1) ? 0.5 * k * k : -0.5 * (--k * (k - 2) - 1);
}
);
/**
* 三次缓动函数。包含EaseIn、EaseOut、EaseInOut三个函数。
*/
var Cubic = createEase(null,
function(k){
return k * k * k;
},
function(k){
return --k * k * k + 1;
},
function(k){
return ((k *= 2) < 1) ? 0.5 * k * k * k : 0.5 * ((k -= 2) * k * k + 2);
}
);
/**
* 四次缓动函数。包含EaseIn、EaseOut、EaseInOut三个函数。
*/
var Quart = createEase(null,
function(k){
return k * k * k * k;
},
function(k){
return -(--k * k * k * k - 1);
},
function(k){
return ((k *= 2) < 1) ? 0.5 * k * k * k * k : - 0.5 * ((k -= 2) * k * k * k - 2);
}
);
/**
* 五次缓动函数。包含EaseIn、EaseOut、EaseInOut三个函数。
*/
var Quint = createEase(null,
function(k){
return k * k * k * k * k;
},
function(k){
return (k = k - 1) * k * k * k * k + 1;
},
function(k){
return ((k *= 2) < 1) ? 0.5 * k * k * k * k * k : 0.5 * ((k -= 2) * k * k * k * k + 2);
}
);
var math = Math,
PI = math.PI, HALF_PI = PI * 0.5,
sin = math.sin, cos = math.cos,
pow = math.pow, sqrt = math.sqrt;
/**
* 正弦缓动函数。包含EaseIn、EaseOut、EaseInOut三个函数。
*/
var Sine = createEase(null,
function(k){
return -cos(k * HALF_PI) + 1;
},
function(k){
return sin(k * HALF_PI);
},
function(k){
return -0.5 * (cos(PI * k) - 1);
}
);
/**
* 指数缓动函数。包含EaseIn、EaseOut、EaseInOut三个函数。
*/
var Expo = createEase(null,
function(k){
return k == 0 ? 0 : pow(2, 10 * (k - 1));
},
function(k){
return k == 1 ? 1 : -pow(2, -10 * k) + 1;
},
function(k){
if(k == 0 || k == 1) return k;
if((k *= 2) < 1) return 0.5 * pow(2, 10 * (k - 1));
return 0.5 * (-pow(2, - 10 * (k - 1)) + 2);
}
);
/**
* 圆形缓动函数。包含EaseIn、EaseOut、EaseInOut三个函数。
*/
var Circ = createEase(null,
function(k){
return -(sqrt(1 - k * k) - 1);
},
function(k){
return sqrt(1 - (--k * k));
},
function(k){
if((k /= 0.5) < 1) return - 0.5 * (sqrt(1 - k * k) - 1);
return 0.5 * (sqrt(1 - (k -= 2) * k) + 1);
}
);
/**
* 弹性缓动函数。包含EaseIn、EaseOut、EaseInOut三个函数。
*/
var Elastic = createEase(
{
a: 1,
p: 0.4,
s: 0.1,
config: function(amplitude, period){
Elastic.a = amplitude;
Elastic.p = period;
Elastic.s = period / (2 * PI) * Math.asin(1 / amplitude) || 0;
}
},
function(k){
return -(Elastic.a * pow(2, 10 * (k -= 1)) * sin((k - Elastic.s) * (2 * PI) / Elastic.p));
},
function(k){
return (Elastic.a * pow(2, -10 * k) * sin((k - Elastic.s) * (2 * PI) / Elastic.p) + 1);
},
function(k){
return ((k *= 2) < 1) ? -0.5 * (Elastic.a * pow(2, 10 * (k -= 1)) * sin((k - Elastic.s) * (2 * PI) / Elastic.p)) :
Elastic.a * pow(2, -10 * (k -= 1)) * sin((k - Elastic.s) * (2 * PI) / Elastic.p) * 0.5 + 1;
}
);
/**
* 向后缓动函数。包含EaseIn、EaseOut、EaseInOut三个函数。
*/
var Back = createEase(
{
o: 1.70158,
s: 2.59491,
config: function(overshoot){
Back.o = overshoot;
Back.s = overshoot * 1.525;
}
},
function(k){
return k * k * ((Back.o + 1) * k - Back.o);
},
function(k){
return (k = k - 1) * k * ((Back.o + 1) * k + Back.o) + 1;
},
function(k){
return ((k *= 2) < 1) ? 0.5 * (k * k * ((Back.s + 1) * k - Back.s)) : 0.5 * ((k -= 2) * k * ((Back.s + 1) * k + Back.s) + 2);
}
);
/**
* 弹跳缓动函数。包含EaseIn、EaseOut、EaseInOut三个函数。
*/
var Bounce = createEase(null,
function(k){
return 1 - Bounce.EaseOut(1 - k);
},
function(k){
if((k /= 1) < 0.36364){
return 7.5625 * k * k;
}else if(k < 0.72727){
return 7.5625 * (k -= 0.54545) * k + 0.75;
}else if(k < 0.90909){
return 7.5625 * (k -= 0.81818) * k + 0.9375;
}else{
return 7.5625 * (k -= 0.95455) * k + 0.984375;
}
},
function(k){
return k < 0.5 ? Bounce.EaseIn(k * 2) * 0.5 : Bounce.EaseOut(k * 2 - 1) * 0.5 + 0.5;
}
);
return {
Linear: Linear,
Quad: Quad,
Cubic: Cubic,
Quart: Quart,
Quint: Quint,
Sine: Sine,
Expo: Expo,
Circ: Circ,
Elastic: Elastic,
Back: Back,
Bounce: Bounce
};
})();