util-15.動畫相關(animationUtil)


/**
 * ========================15.動畫相關 s========================
 */
/**
 * Tween.js 緩動動畫
 * t: current time(當前時間)
 * b: beginning value(初始值)
 * c: change in value(變化量)
 * d: duration(持續時間)
 * @type {{Quad: {easeInOut: Tween.Quad.easeInOut, easeIn: (function(*, *, *, *): *), easeOut: (function(*, *, *, *): *)}, Quart: {easeInOut: Tween.Quart.easeInOut, easeIn: (function(*, *, *, *): *), easeOut: (function(*, *, *, *): *)}, Expo: {easeInOut: Tween.Expo.easeInOut, easeIn: (function(*, *, *, *): *), easeOut: (function(*, *, *, *): *)}, Elastic: {easeInOut: Tween.Elastic.easeInOut, easeIn: Tween.Elastic.easeIn, easeOut: Tween.Elastic.easeOut}, Quint: {easeInOut: Tween.Quint.easeInOut, easeIn: (function(*, *, *, *): *), easeOut: (function(*, *, *, *): *)}, Circ: {easeInOut: Tween.Circ.easeInOut, easeIn: (function(*, *, *, *): *), easeOut: (function(*, *, *, *): *)}, Back: {easeInOut: Tween.Back.easeInOut, easeIn: (function(*, *, *, *, *=): *), easeOut: (function(*, *, *, *, *=): *)}, Sine: {easeInOut: (function(*, *, *, *): *), easeIn: (function(*, *, *, *): *), easeOut: (function(*, *, *, *): *)}, Bounce: {easeInOut: Tween.Bounce.easeInOut, easeIn: (function(*, *, *=, *=): *), easeOut: Tween.Bounce.easeOut}, Cubic: {easeInOut: Tween.Cubic.easeInOut, easeIn: (function(*, *, *, *): *), easeOut: (function(*, *, *, *): *)}, Linear: (function(*, *, *, *): *)}}
 */
var Tween = {
    "Linear": function(t, b, c, d) { return c*t/d + b; },
    "Quad": {
        "easeIn": function(t, b, c, d) {
            return c * (t /= d) * t + b;
        },
        "easeOut": function(t, b, c, d) {
            return -c *(t /= d)*(t-2) + b;
        },
        "easeInOut": function(t, b, c, d) {
            if ((t /= d / 2) < 1) return c / 2 * t * t + b;
            return -c / 2 * ((--t) * (t-2) - 1) + b;
        }
    },
    "Cubic": {
        "easeIn": function(t, b, c, d) {
            return c * (t /= d) * t * t + b;
        },
        "easeOut": function(t, b, c, d) {
            return c * ((t = t/d - 1) * t * t + 1) + b;
        },
        "easeInOut": function(t, b, c, d) {
            if ((t /= d / 2) < 1) return c / 2 * t * t*t + b;
            return c / 2*((t -= 2) * t * t + 2) + b;
        }
    },
    "Quart": {
        "easeIn": function(t, b, c, d) {
            return c * (t /= d) * t * t*t + b;
        },
        "easeOut": function(t, b, c, d) {
            return -c * ((t = t/d - 1) * t * t*t - 1) + b;
        },
        "easeInOut": function(t, b, c, d) {
            if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b;
            return -c / 2 * ((t -= 2) * t * t*t - 2) + b;
        }
    },
    "Quint": {
        "easeIn": function(t, b, c, d) {
            return c * (t /= d) * t * t * t * t + b;
        },
        "easeOut": function(t, b, c, d) {
            return c * ((t = t/d - 1) * t * t * t * t + 1) + b;
        },
        "easeInOut": function(t, b, c, d) {
            if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;
            return c / 2*((t -= 2) * t * t * t * t + 2) + b;
        }
    },
    "Sine": {
        "easeIn": function(t, b, c, d) {
            return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
        },
        "easeOut": function(t, b, c, d) {
            return c * Math.sin(t/d * (Math.PI/2)) + b;
        },
        "easeInOut": function(t, b, c, d) {
            return -c / 2 * (Math.cos(Math.PI * t/d) - 1) + b;
        }
    },
    "Expo": {
        "easeIn": function(t, b, c, d) {
            return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
        },
        "easeOut": function(t, b, c, d) {
            return (t==d) ? b + c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
        },
        "easeInOut": function(t, b, c, d) {
            if (t==0) return b;
            if (t==d) return b+c;
            if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;
            return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;
        }
    },
    "Circ": {
        "easeIn": function(t, b, c, d) {
            return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;
        },
        "easeOut": function(t, b, c, d) {
            return c * Math.sqrt(1 - (t = t/d - 1) * t) + b;
        },
        "easeInOut": function(t, b, c, d) {
            if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;
            return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;
        }
    },
    "Elastic": {
        "easeIn": function(t, b, c, d, a, p) {
            var s;
            if (t==0) return b;
            if ((t /= d) == 1) return b + c;
            if (typeof p == "undefined") p = d * .3;
            if (!a || a < Math.abs(c)) {
                s = p / 4;
                a = c;
            } else {
                s = p / (2 * Math.PI) * Math.asin(c / a);
            }
            return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
        },
        "easeOut": function(t, b, c, d, a, p) {
            var s;
            if (t==0) return b;
            if ((t /= d) == 1) return b + c;
            if (typeof p == "undefined") p = d * .3;
            if (!a || a < Math.abs(c)) {
                a = c;
                s = p / 4;
            } else {
                s = p/(2*Math.PI) * Math.asin(c/a);
            }
            return (a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b);
        },
        "easeInOut": function(t, b, c, d, a, p) {
            var s;
            if (t==0) return b;
            if ((t /= d / 2) == 2) return b+c;
            if (typeof p == "undefined") p = d * (.3 * 1.5);
            if (!a || a < Math.abs(c)) {
                a = c;
                s = p / 4;
            } else {
                s = p / (2  *Math.PI) * Math.asin(c / a);
            }
            if (t < 1) return -.5 * (a * Math.pow(2, 10* (t -=1 )) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
            return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p ) * .5 + c + b;
        }
    },
    "Back": {
        "easeIn": function(t, b, c, d, s) {
            if (typeof s == "undefined") s = 1.70158;
            return c * (t /= d) * t * ((s + 1) * t - s) + b;
        },
        "easeOut": function(t, b, c, d, s) {
            if (typeof s == "undefined") s = 1.70158;
            return c * ((t = t/d - 1) * t * ((s + 1) * t + s) + 1) + b;
        },
        "easeInOut": function(t, b, c, d, s) {
            if (typeof s == "undefined") s = 1.70158;
            if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;
            return c / 2*((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;
        }
    },
    "Bounce": {
        "easeIn": function(t, b, c, d) {
            return c - Tween.Bounce.easeOut(d-t, 0, c, d) + b;
        },
        "easeOut": function(t, b, c, d) {
            if ((t /= d) < (1 / 2.75)) {
                return c * (7.5625 * t * t) + b;
            } else if (t < (2 / 2.75)) {
                return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;
            } else if (t < (2.5 / 2.75)) {
                return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;
            } else {
                return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;
            }
        },
        "easeInOut": function(t, b, c, d) {
            if (t < d / 2) {
                return Tween.Bounce.easeIn(t * 2, 0, c, d) * .5 + b;
            } else {
                return Tween.Bounce.easeOut(t * 2 - d, 0, c, d) * .5 + c * .5 + b;
            }
        }
    }
}
Math.tween = Tween;

/**
 * 監聽初始化
 */
window.requestAnimFrame = (function(){
    return window.requestAnimationFrame ||
        window.webkitRequestAnimationFrame ||
        window.mozRequestAnimationFrame ||
        function( callback ){
            window.setTimeout(callback, 1000 / 60);
        };
})();

/**
 * polyfill----------requestAnimationFrame加速硬件執行動畫
 */
(function() {
    var lastTime = 0;
    var vendors = ['webkit', 'moz'];
    for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
        window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
        window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] ||    // Webkit中此取消方法的名字變了
            window[vendors[x] + 'CancelRequestAnimationFrame'];
    }

    if (!window.requestAnimationFrame) {
        window.requestAnimationFrame = function(callback, element) {
            var currTime = new Date().getTime();
            var timeToCall = Math.max(0, 16.7 - (currTime - lastTime));
            var id = window.setTimeout(function() {
                callback(currTime + timeToCall);
            }, timeToCall);
            lastTime = currTime + timeToCall;
            return id;
        };
    }
    if (!window.cancelAnimationFrame) {
        window.cancelAnimationFrame = function(id) {
            clearTimeout(id);
        };
    }
}());
/**
 * ========================15.動畫相關 e========================
 */

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章