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 })();