mirror of
https://github.com/hiloteam/Hilo.git
synced 2025-12-08 20:35:59 +00:00
253 lines
5.5 KiB
JavaScript
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
|
|
};
|
|
|
|
})(); |