1 /**
  2  * Hilo
  3  * Copyright 2015 alibaba.com
  4  * Licensed under the MIT License
  5  */
  6 
  7 /**
  8  * @language=en
  9  * @class Ease class provides multiple easing functions for Tween.
 10  * @module hilo/tween/Ease
 11  * @static
 12  */
 13 var Ease = (function(){
 14 
 15 function createEase(obj, easeInFn, easeOutFn, easeInOutFn, easeNoneFn){
 16     obj = obj || {};
 17     easeInFn && (obj.EaseIn = easeInFn);
 18     easeOutFn && (obj.EaseOut = easeOutFn);
 19     easeInOutFn && (obj.EaseInOut = easeInOutFn);
 20     easeNoneFn && (obj.EaseNone = easeNoneFn);
 21     return obj;
 22 }
 23 
 24 /**
 25  * @language=en
 26  * Linear easing function.Include EaseNone.
 27  */
 28 var Linear = createEase(null, null, null, null, function(k){
 29     return k;
 30 });
 31 
 32 /**
 33  * @language=en
 34  * Quad easing function.Include EaseIn, EaseOut, EaseInOut.
 35  */
 36 var Quad = createEase(null,
 37     function(k){
 38         return k * k;
 39     },
 40 
 41     function(k){
 42         return - k * (k - 2);
 43     },
 44 
 45     function(k){
 46         return ((k *= 2) < 1) ? 0.5 * k * k : -0.5 * (--k * (k - 2) - 1);
 47     }
 48 );
 49 
 50 /**
 51  * @language=en
 52  * Cubic easing function.Include EaseIn, EaseOut, EaseInOut.
 53  */
 54 var Cubic = createEase(null,
 55     function(k){
 56         return k * k * k;
 57     },
 58 
 59     function(k){
 60         return --k * k * k + 1;
 61     },
 62 
 63     function(k){
 64         return ((k *= 2) < 1) ? 0.5 * k * k * k : 0.5 * ((k -= 2) * k * k + 2);
 65     }
 66 );
 67 
 68 /**
 69  * @language=en
 70  * Quart easing function.Include EaseIn, EaseOut, EaseInOut.
 71  */
 72 var Quart = createEase(null,
 73     function(k){
 74         return k * k * k * k;
 75     },
 76 
 77     function(k){
 78         return -(--k * k * k * k - 1);
 79     },
 80 
 81     function(k){
 82         return ((k *= 2) < 1) ? 0.5 * k * k * k * k : - 0.5 * ((k -= 2) * k * k * k - 2);
 83     }
 84 );
 85 
 86 /**
 87  * @language=en
 88  * Quint easing function.Include EaseIn, EaseOut, EaseInOut.
 89  */
 90 var Quint = createEase(null,
 91     function(k){
 92         return k * k * k * k * k;
 93     },
 94 
 95     function(k){
 96         return (k = k - 1) * k * k * k * k + 1;
 97     },
 98 
 99     function(k){
100         return ((k *= 2) < 1) ? 0.5 * k * k * k * k * k : 0.5 * ((k -= 2) * k * k * k * k + 2);
101     }
102 );
103 
104 var math = Math,
105     PI = math.PI, HALF_PI = PI * 0.5,
106     sin = math.sin, cos = math.cos,
107     pow = math.pow, sqrt = math.sqrt;
108 
109 /**
110  * @language=en
111  * Sine easing function.Include EaseIn, EaseOut, EaseInOut.
112  */
113 var Sine = createEase(null,
114     function(k){
115         return -cos(k * HALF_PI) + 1;
116     },
117 
118     function(k){
119         return sin(k * HALF_PI);
120     },
121 
122     function(k){
123         return -0.5 * (cos(PI * k) - 1);
124     }
125 );
126 
127 /**
128  * @language=en
129  * Expo easing function.Include EaseIn, EaseOut, EaseInOut.
130  */
131 var Expo = createEase(null,
132     function(k){
133         return k == 0 ? 0 : pow(2, 10 * (k - 1));
134     },
135 
136     function(k){
137         return k == 1 ? 1 : -pow(2, -10 * k) + 1;
138     },
139 
140     function(k){
141         if(k == 0 || k == 1) return k;
142         if((k *= 2) < 1) return 0.5 * pow(2, 10 * (k - 1));
143         return 0.5 * (-pow(2, - 10 * (k - 1)) + 2);
144     }
145 );
146 
147 /**
148  * @language=en
149  * Circ easing function.Include EaseIn, EaseOut, EaseInOut.
150  */
151 var Circ = createEase(null,
152     function(k){
153         return -(sqrt(1 - k * k) - 1);
154     },
155 
156     function(k){
157         return sqrt(1 - --k * k);
158     },
159 
160     function(k){
161         if((k /= 0.5) < 1) return - 0.5 * (sqrt(1 - k * k) - 1);
162         return 0.5 * (sqrt(1 - (k -= 2) * k) + 1);
163     }
164 );
165 
166 /**
167  * @language=en
168  * Elastic easing function.Include EaseIn, EaseOut, EaseInOut.
169  */
170 var Elastic = createEase(
171     {
172         a: 1,
173         p: 0.4,
174         s: 0.1,
175 
176         config: function(amplitude, period){
177             Elastic.a = amplitude;
178             Elastic.p = period;
179             Elastic.s = period / (2 * PI) * Math.asin(1 / amplitude) || 0;
180         }
181     },
182 
183     function(k){
184         return -(Elastic.a * pow(2, 10 * (k -= 1)) * sin((k - Elastic.s) * (2 * PI) / Elastic.p));
185     },
186 
187     function(k){
188         return (Elastic.a * pow(2, -10 * k) * sin((k - Elastic.s) * (2 * PI) / Elastic.p) + 1);
189     },
190 
191     function(k){
192         return ((k *= 2) < 1) ? -0.5 * (Elastic.a * pow(2, 10 * (k -= 1)) * sin((k - Elastic.s) * (2 * PI) / Elastic.p)) :
193                Elastic.a * pow(2, -10 * (k -= 1)) * sin((k - Elastic.s) * (2 * PI) / Elastic.p) * 0.5 + 1;
194     }
195 );
196 
197 /**
198  * @language=en
199  * Back easing function.Include EaseIn, EaseOut, EaseInOut.
200  */
201 var Back = createEase(
202     {
203         o: 1.70158,
204         s: 2.59491,
205 
206         config: function(overshoot){
207             Back.o = overshoot;
208             Back.s = overshoot * 1.525;
209         }
210     },
211 
212     function(k){
213         return k * k * ((Back.o + 1) * k - Back.o);
214     },
215 
216     function(k){
217         return (k = k - 1) * k * ((Back.o + 1) * k + Back.o) + 1;
218     },
219 
220     function(k){
221         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);
222     }
223 );
224 
225 /**
226  * @language=en
227  * Bounce easing function.Include EaseIn, EaseOut, EaseInOut.
228  */
229 var Bounce = createEase(null,
230     function(k){
231         return 1 - Bounce.EaseOut(1 - k);
232     },
233 
234     function(k){
235         if((k /= 1) < 0.36364){
236             return 7.5625 * k * k;
237         }else if(k < 0.72727){
238             return 7.5625 * (k -= 0.54545) * k + 0.75;
239         }else if(k < 0.90909){
240             return 7.5625 * (k -= 0.81818) * k + 0.9375;
241         }else{
242             return 7.5625 * (k -= 0.95455) * k + 0.984375;
243         }
244     },
245 
246     function(k){
247         return k < 0.5 ? Bounce.EaseIn(k * 2) * 0.5 : Bounce.EaseOut(k * 2 - 1) * 0.5 + 0.5;
248     }
249 );
250 
251 return {
252     Linear: Linear,
253     Quad: Quad,
254     Cubic: Cubic,
255     Quart: Quart,
256     Quint: Quint,
257     Sine: Sine,
258     Expo: Expo,
259     Circ: Circ,
260     Elastic: Elastic,
261     Back: Back,
262     Bounce: Bounce
263 }
264 
265 })();