TextFx——Ease Function(緩動函數)
By D.S.Qiu
尊重他人的勞動,支持原創,轉載請注明出處:http://dsqiu.iteye.com
之前有介紹過UITweener(點擊前往),NGUI用了一個目錄“收集”Tween腳本,集成的功能還是很豐富的,只提供了6種緩動函數(Ease Fuction):Linear,EaseIn,EaSEOut,EaseInOut,BounceIn和BounceOut。當時,對緩動函數就只是一知半解。后面為了做文字特效,就發現了 TextFx 插件,這個插件太贊了,讓我有種感覺一切效果都可以用代碼模擬。TextFx提供了40種緩動函數,表現效果豐富了很多,激動之余,總是想著能不能把這些緩動函數移植到UITweener里面去,所以才有了此文。
下面就直接貼出Ease Function的實現,方便查看。
Method:
擴容之后的Method的樣式由6種變為41種:
C#代碼
public enum Method { Linear, EaseIn,EaseOut,EaseInOut,BounceIn,BounceOut, QuadEaseOut, QuadEaseIn, QuadEaseInOut, QuadEaseOutIn, //新增40種動畫效果 ExpoEaseOut, ExpoEaseIn, ExpoEaseInOut, ExpoEaseOutIn, CubicEaseOut, CubicEaseIn, CubicEaseInOut, CubicEaseOutIn, QuartEaseOut, QuartEaseIn, QuartEaseInOut, QuartEaseOutIn, QuintEaseOut, QuintEaseIn, QuintEaseInOut, QuintEaseOutIn, CircEaseOut, CircEaseIn, CircEaseInOut, CircEaseOutIn, SineEaseOut, SineEaseIn, SineEaseInOut, SineEaseOutIn, ElasticEaseOut, ElasticEaseIn, ElasticEaseInOut, ElasticEaseOutIn, BounceEaseOut, BounceEaseIn, BounceEaseInOut, BounceEaseOutIn, BackEaseOut, BackEaseIn, BackEaseInOut, BackEaseOutIn }
Sample:
C#代碼
public static float GetEasePRogress(Method ease_type, float linear_progress) switch (ease_type) { case Method.Linear: return linear_progress; case Method.BackEaseIn: return BackEaseIn(linear_progress, 0, 1, 1); case Method.BackEaseInOut: return BackEaseInOut(linear_progress, 0, 1, 1); case Method.BackEaseOut: return BackEaseOut(linear_progress, 0, 1, 1); case Method.BackEaseOutIn: return BackEaseOutIn(linear_progress, 0, 1, 1); case Method.BounceEaseIn: return BounceEaseIn(linear_progress, 0, 1, 1); case Method.BounceEaseInOut: return BounceEaseInOut(linear_progress, 0, 1, 1); case Method.BounceEaseOut: return BounceEaseOut(linear_progress, 0, 1, 1); case Method.BounceEaseOutIn: return BounceEaseOutIn(linear_progress, 0, 1, 1); case Method.CircEaseIn: return CircEaseIn(linear_progress, 0, 1, 1); case Method.CircEaseInOut: return CircEaseInOut(linear_progress, 0, 1, 1); case Method.CircEaseOut: return CircEaseOut(linear_progress, 0, 1, 1); case Method.CircEaseOutIn: return CircEaseOutIn(linear_progress, 0, 1, 1); case Method.CubicEaseIn: return CubicEaseIn(linear_progress, 0, 1, 1); case Method.CubicEaseInOut: return CubicEaseInOut(linear_progress, 0, 1, 1); case Method.CubicEaseOut: return CubicEaseOut(linear_progress, 0, 1, 1); case Method.CubicEaseOutIn: return CubicEaseOutIn(linear_progress, 0, 1, 1); case Method.ElasticEaseIn: return ElasticEaseIn(linear_progress, 0, 1, 1); case Method.ElasticEaseInOut: return ElasticEaseInOut(linear_progress, 0, 1, 1); case Method.ElasticEaseOut: return ElasticEaseOut(linear_progress, 0, 1, 1); case Method.ElasticEaseOutIn: return ElasticEaseOutIn(linear_progress, 0, 1, 1); case Method.ExpoEaseIn: return ExpoEaseIn(linear_progress, 0, 1, 1); case Method.ExpoEaseInOut: return ExpoEaseInOut(linear_progress, 0, 1, 1); case Method.ExpoEaseOut: return ExpoEaseOut(linear_progress, 0, 1, 1); case Method.ExpoEaseOutIn: return ExpoEaseOutIn(linear_progress, 0, 1, 1); case Method.QuadEaseIn: return QuadEaseIn(linear_progress, 0, 1, 1); case Method.QuadEaseInOut: return QuadEaseInOut(linear_progress, 0, 1, 1); case Method.QuadEaseOut: return QuadEaseOut(linear_progress, 0, 1, 1); case Method.QuadEaseOutIn: return QuadEaseOutIn(linear_progress, 0, 1, 1); case Method.QuartEaseIn: return QuartEaseIn(linear_progress, 0, 1, 1); case Method.QuartEaseInOut: return QuartEaseInOut(linear_progress, 0, 1, 1); case Method.QuartEaseOut: return QuartEaseOut(linear_progress, 0, 1, 1); case Method.QuartEaseOutIn: return QuartEaseOutIn(linear_progress, 0, 1, 1); case Method.QuintEaseIn: return QuintEaseIn(linear_progress, 0, 1, 1); case Method.QuintEaseInOut: return QuintEaseInOut(linear_progress, 0, 1, 1); case Method.QuintEaseOut: return QuintEaseOut(linear_progress, 0, 1, 1); case Method.QuintEaseOutIn: return QuintEaseOutIn(linear_progress, 0, 1, 1); case Method.SineEaseIn: return SineEaseIn(linear_progress, 0, 1, 1); case Method.SineEaseInOut: return SineEaseInOut(linear_progress, 0, 1, 1); case Method.SineEaseOut: return SineEaseOut(linear_progress, 0, 1, 1); case Method.SineEaseOutIn: return SineEaseOutIn(linear_progress, 0, 1, 1); default: return linear_progress; }
Ease Function:
C#代碼
/* EASING FUNCTIONS */ #region Linear /// <summary> /// Easing equation function for a simple linear tweening, with no easing. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float Linear(float t, float b, float c, float d) { return c * t / d + b; } #endregion #region Expo /// <summary> /// Easing equation function for an exponential (2^t) easing out: /// decelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float ExpoEaseOut(float t, float b, float c, float d) { return (t == d) ? b + c : c * (-Mathf.Pow(2, -10 * t / d) + 1) + b; } /// <summary> /// Easing equation function for an exponential (2^t) easing in: /// accelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float ExpoEaseIn(float t, float b, float c, float d) { return (t == 0) ? b : c * Mathf.Pow(2, 10 * (t / d - 1)) + b; } /// <summary> /// Easing equation function for an exponential (2^t) easing in/out: /// acceleration until halfway, then deceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float ExpoEaseInOut(float t, float b, float c, float d) { if (t == 0) return b; if (t == d) return b + c; if ((t /= d / 2) < 1) return c / 2 * Mathf.Pow(2, 10 * (t - 1)) + b; return c / 2 * (-Mathf.Pow(2, -10 * --t) + 2) + b; } /// <summary> /// Easing equation function for an exponential (2^t) easing out/in: /// deceleration until halfway, then acceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float ExpoEaseOutIn(float t, float b, float c, float d) { if (t < d / 2) return ExpoEaseOut(t * 2, b, c / 2, d); return ExpoEaseIn((t * 2) - d, b + c / 2, c / 2, d); } #endregion #region Circular /// <summary> /// Easing equation function for a circular (sqrt(1-t^2)) easing out: /// decelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float CircEaseOut(float t, float b, float c, float d) { return c * Mathf.Sqrt(1 - (t = t / d - 1) * t) + b; } /// <summary> /// Easing equation function for a circular (sqrt(1-t^2)) easing in: /// accelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float CircEaseIn(float t, float b, float c, float d) { return -c * (Mathf.Sqrt(1 - (t /= d) * t) - 1) + b; } /// <summary> /// Easing equation function for a circular (sqrt(1-t^2)) easing in/out: /// acceleration until halfway, then deceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float CircEaseInOut(float t, float b, float c, float d) { if ((t /= d / 2) < 1) return -c / 2 * (Mathf.Sqrt(1 - t * t) - 1) + b; return c / 2 * (Mathf.Sqrt(1 - (t -= 2) * t) + 1) + b; } /// <summary> /// Easing equation function for a circular (sqrt(1-t^2)) easing in/out: /// acceleration until halfway, then deceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float CircEaseOutIn(float t, float b, float c, float d) { if (t < d / 2) return CircEaseOut(t * 2, b, c / 2, d); return CircEaseIn((t * 2) - d, b + c / 2, c / 2, d); } #endregion #region Quad /// <summary> /// Easing equation function for a quadratic (t^2) easing out: /// decelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float QuadEaseOut(float t, float b, float c, float d) { return -c * (t /= d) * (t - 2) + b; } /// <summary> /// Easing equation function for a quadratic (t^2) easing in: /// accelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float QuadEaseIn(float t, float b, float c, float d) { return c * (t /= d) * t + b; } /// <summary> /// Easing equation function for a quadratic (t^2) easing in/out: /// acceleration until halfway, then deceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float QuadEaseInOut(float t, float b, float c, float d) { if ((t /= d / 2) < 1) return c / 2 * t * t + b; return -c / 2 * ((--t) * (t - 2) - 1) + b; } /// <summary> /// Easing equation function for a quadratic (t^2) easing out/in: /// deceleration until halfway, then acceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float QuadEaseOutIn(float t, float b, float c, float d) { if (t < d / 2) return QuadEaseOut(t * 2, b, c / 2, d); return QuadEaseIn((t * 2) - d, b + c / 2, c / 2, d); } #endregion #region Sine /// <summary> /// Easing equation function for a sinusoidal (sin(t)) easing out: /// decelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float SineEaseOut(float t, float b, float c, float d) { return c * Mathf.Sin(t / d * (Mathf.PI / 2)) + b; } /// <summary> /// Easing equation function for a sinusoidal (sin(t)) easing in: /// accelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float SineEaseIn(float t, float b, float c, float d) { return -c * Mathf.Cos(t / d * (Mathf.PI / 2)) + c + b; } /// <summary> /// Easing equation function for a sinusoidal (sin(t)) easing in/out: /// acceleration until halfway, then deceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float SineEaseInOut(float t, float b, float c, float d) { if ((t /= d / 2) < 1) return c / 2 * (Mathf.Sin(Mathf.PI * t / 2)) + b; return -c / 2 * (Mathf.Cos(Mathf.PI * --t / 2) - 2) + b; } /// <summary> /// Easing equation function for a sinusoidal (sin(t)) easing in/out: /// deceleration until halfway, then acceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float SineEaseOutIn(float t, float b, float c, float d) { if (t < d / 2) return SineEaseOut(t * 2, b, c / 2, d); return SineEaseIn((t * 2) - d, b + c / 2, c / 2, d); } #endregion #region Cubic /// <summary> /// Easing equation function for a cubic (t^3) easing out: /// decelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float CubicEaseOut(float t, float b, float c, float d) { return c * ((t = t / d - 1) * t * t + 1) + b; } /// <summary> /// Easing equation function for a cubic (t^3) easing in: /// accelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float CubicEaseIn(float t, float b, float c, float d) { return c * (t /= d) * t * t + b; } /// <summary> /// Easing equation function for a cubic (t^3) easing in/out: /// acceleration until halfway, then deceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float CubicEaseInOut(float t, float b, float c, float d) { if ((t /= d / 2) < 1) return c / 2 * t * t * t + b; return c / 2 * ((t -= 2) * t * t + 2) + b; } /// <summary> /// Easing equation function for a cubic (t^3) easing out/in: /// deceleration until halfway, then acceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float CubicEaseOutIn(float t, float b, float c, float d) { if (t < d / 2) return CubicEaseOut(t * 2, b, c / 2, d); return CubicEaseIn((t * 2) - d, b + c / 2, c / 2, d); } #endregion #region Quartic /// <summary> /// Easing equation function for a quartic (t^4) easing out: /// decelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float QuartEaseOut(float t, float b, float c, float d) { return -c * ((t = t / d - 1) * t * t * t - 1) + b; } /// <summary> /// Easing equation function for a quartic (t^4) easing in: /// accelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float QuartEaseIn(float t, float b, float c, float d) { return c * (t /= d) * t * t * t + b; } /// <summary> /// Easing equation function for a quartic (t^4) easing in/out: /// acceleration until halfway, then deceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float QuartEaseInOut(float t, float b, float c, float d) { if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b; return -c / 2 * ((t -= 2) * t * t * t - 2) + b; } /// <summary> /// Easing equation function for a quartic (t^4) easing out/in: /// deceleration until halfway, then acceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float QuartEaseOutIn(float t, float b, float c, float d) { if (t < d / 2) return QuartEaseOut(t * 2, b, c / 2, d); return QuartEaseIn((t * 2) - d, b + c / 2, c / 2, d); } #endregion #region Quintic /// <summary> /// Easing equation function for a quintic (t^5) easing out: /// decelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float QuintEaseOut(float t, float b, float c, float d) { return c * ((t = t / d - 1) * t * t * t * t + 1) + b; } /// <summary> /// Easing equation function for a quintic (t^5) easing in: /// accelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float QuintEaseIn(float t, float b, float c, float d) { return c * (t /= d) * t * t * t * t + b; } /// <summary> /// Easing equation function for a quintic (t^5) easing in/out: /// acceleration until halfway, then deceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float QuintEaseInOut(float t, float b, float c, float 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; } /// <summary> /// Easing equation function for a quintic (t^5) easing in/out: /// acceleration until halfway, then deceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float QuintEaseOutIn(float t, float b, float c, float d) { if (t < d / 2) return QuintEaseOut(t * 2, b, c / 2, d); return QuintEaseIn((t * 2) - d, b + c / 2, c / 2, d); } #endregion #region Elastic /// <summary> /// Easing equation function for an elastic (exponentially decaying sine wave) easing out: /// decelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float ElasticEaseOut(float t, float b, float c, float d) { if ((t /= d) == 1) return b + c; float p = d * 0.3f; float s = p / 4; return (c * Mathf.Pow(2, -10 * t) * Mathf.Sin((t * d - s) * (2 * Mathf.PI) / p) + c + b); } /// <summary> /// Easing equation function for an elastic (exponentially decaying sine wave) easing in: /// accelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float ElasticEaseIn(float t, float b, float c, float d) { if ((t /= d) == 1) return b + c; float p = d * 0.3f; float s = p / 4; return -(c * Mathf.Pow(2, 10 * (t -= 1)) * Mathf.Sin((t * d - s) * (2 * Mathf.PI) / p)) + b; } /// <summary> /// Easing equation function for an elastic (exponentially decaying sine wave) easing in/out: /// acceleration until halfway, then deceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float ElasticEaseInOut(float t, float b, float c, float d) { if ((t /= d / 2f) == 2) return b + c; float p = d * (0.3f * 1.5f); float s = p / 4; if (t < 1) return -0.5f * (c * Mathf.Pow(2, 10 * (t -= 1)) * Mathf.Sin((t * d - s) * (2 * Mathf.PI) / p)) + b; return c * Mathf.Pow(2, -10 * (t -= 1)) * Mathf.Sin((t * d - s) * (2 * Mathf.PI) / p) * 0.5f + c + b; } /// <summary> /// Easing equation function for an elastic (exponentially decaying sine wave) easing out/in: /// deceleration until halfway, then acceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float ElasticEaseOutIn(float t, float b, float c, float d) { if (t < d / 2) return ElasticEaseOut(t * 2, b, c / 2, d); return ElasticEaseIn((t * 2) - d, b + c / 2, c / 2, d); } #endregion #region Bounce /// <summary> /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out: /// decelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float BounceEaseOut(float t, float b, float c, float d) { if ((t /= d) < (1 / 2.75f)) return c * (7.5625f * t * t) + b; else if (t < (2 / 2.75f)) return c * (7.5625f * (t -= (1.5f / 2.75f)) * t + 0.75f) + b; else if (t < (2.5f / 2.75f)) return c * (7.5625f * (t -= (2.25f / 2.75f)) * t + 0.9375f) + b; else return c * (7.5625f * (t -= (2.625f / 2.75f)) * t + .984375f) + b; } /// <summary> /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in: /// accelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float BounceEaseIn(float t, float b, float c, float d) { return c - BounceEaseOut(d - t, 0, c, d) + b; } /// <summary> /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in/out: /// acceleration until halfway, then deceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float BounceEaseInOut(float t, float b, float c, float d) { if (t < d / 2) return BounceEaseIn(t * 2, 0, c, d) * 0.5f + b; else return BounceEaseOut(t * 2 - d, 0, c, d) * 0.5f + c * 0.5f + b; } /// <summary> /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out/in: /// deceleration until halfway, then acceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float BounceEaseOutIn(float t, float b, float c, float d) { if (t < d / 2) return BounceEaseOut(t * 2, b, c / 2, d); return BounceEaseIn((t * 2) - d, b + c / 2, c / 2, d); } #endregion #region Back /// <summary> /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing out: /// decelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float BackEaseOut(float t, float b, float c, float d) { return c * ((t = t / d - 1) * t * ((1.70158f + 1) * t + 1.70158f) + 1) + b; } /// <summary> /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing in: /// accelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float BackEaseIn(float t, float b, float c, float d) { return c * (t /= d) * t * ((1.70158f + 1) * t - 1.70158f) + b; } /// <summary> /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing in/out: /// acceleration until halfway, then deceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float BackEaseInOut(float t, float b, float c, float d) { float s = 1.70158f; if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525f)) + 1) * t - s)) + b; return c / 2 * ((t -= 2) * t * (((s *= (1.525f)) + 1) * t + s) + 2) + b; } /// <summary> /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing out/in: /// deceleration until halfway, then acceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float BackEaseOutIn(float t, float b, float c, float d) { if (t < d / 2) return BackEaseOut(t * 2, b, c / 2, d); return BackEaseIn((t * 2) - d, b + c / 2, c / 2, d); } #endregion
小結:
首先,非常感謝TextFx的作者,然后 TextFx 的插件真的很棒,實用又簡單,而不會華而不實。在UITweener的文章中也對緩動函數有介紹,貼出其中30種的軌跡圖,會更加直觀。此文是為了大家能夠檢索到需要的內容。
『
在UITweener的文末附上了30中緩動曲線的圖形,感覺有點不夠動態,參考①中給出的效果會更好些,更容易理解和體會?!?/p>
增補于 2014,1,14 9:25
如果您對D.S.Qiu有任何建議或意見可以在文章后面評論,或者發郵件(gd.s.qiu@Gmail.com)交流,您的鼓勵和支持是我前進的動力,希望能有更多更好的分享。
轉載請在文首注明出處:http://dsqiu.iteye.com/blog/2001007
更多精彩請關注D.S.Qiu的博客和微博(ID:靜水逐風)
參考:
①robertpenner.com: http://www.robertpenner.com/easing/easing_demo.html
新聞熱點
疑難解答