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