C#動畫效果算法----------WinForm控件開發系列


  /// <summary>
  /// 線性動畫函數(算法基本由Silverlight提取出來)
  /// </summary>
  [Description("線性動畫函數(算法基本由Silverlight提取出來)")]
  public static class AnimationCore
  {
    #region UniformMotion

    /// <summary>
    ///  勻速
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <returns></returns>
    public static double UniformMotion(double origin, double transform, double usedTime, double allTime)
    {
      return origin + transform * UniformMotionCore(usedTime, allTime);
    }
    /// <summary>
    /// 勻速
    /// </summary>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <returns></returns>
    public static double UniformMotionCore(double usedTime, double allTime)
    {
      return usedTime / allTime;
    }

    #endregion

    #region Ease

    /// <summary>
    /// 變速
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <param name="power">動畫曲線冪(默認值2)</param>
    /// <returns></returns>
    public static double EaseIn(double origin, double transform, double usedTime, double allTime, double power)
    {
      return origin + transform * EaseInCore(usedTime / allTime, power);
    }
    /// <summary>
    /// 變速
    /// </summary>
    /// <param name="progressTime">已進行動畫時間/總動畫時間</param>
    /// <param name="power">動畫曲線冪(默認值2)</param>
    /// <returns></returns>
    public static double EaseInCore(double progressTime, double power)
    {
      power = Math.Max(0.0, power);
      return Math.Pow(progressTime, power);
    }
    /// <summary>
    /// 變速
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <param name="power">動畫曲線冪(默認值2)</param>
    /// <returns></returns>
    public static double EaseOut(double origin, double transform, double usedTime, double allTime, double power)
    {
      return origin + transform * (EaseOutCore(usedTime / allTime, power));
    }
    /// <summary>
    /// 變速
    /// </summary>
    /// <param name="progressTime">已進行動畫時間/總動畫時間</param>
    /// <param name="power">動畫曲線冪(默認值2)</param>
    /// <returns></returns>    
    public static double EaseOutCore(double progressTime, double power)
    {
      return 1.0 - EaseInCore(1.0 - progressTime, power);
    }
    /// <summary>
    /// 變速
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <param name="power">動畫曲線冪(默認值2)</param>
    /// <returns></returns>
    public static double EaseBoth(double origin, double transform, double usedTime, double allTime, double power)
    {
      return origin + transform * EaseBothCore(usedTime / allTime, power);
    }
    /// <summary>
    /// 變速
    /// </summary>
    /// <param name="progressTime">已進行動畫時間/總動畫時間</param>
    /// <param name="power">動畫曲線冪(默認值2)</param>
    /// <returns></returns>
    public static double EaseBothCore(double progressTime, double power)
    {
      if (progressTime >= 0.5)
        return (1.0 - EaseInCore((1.0 - progressTime) * 2.0, power)) * 0.5 + 0.5;
      return EaseInCore(progressTime * 2.0, power) * 0.5;
    }

    #endregion

    #region Back

    /// <summary>
    /// 收縮
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <param name="power">動畫曲線冪(默認值3)</param>
    /// <param name="amplitude">收縮與相關聯的幅度動畫。此值必須大於或等於 0。 默認值為 1。</param>
    /// <returns></returns>
    public static double BackIn(double origin, double transform, double usedTime, double allTime, double power, double amplitude)
    {
      return origin + transform * BackInCore((usedTime / allTime), power, amplitude);
    }
    /// <summary>
    /// 收縮
    /// </summary>
    /// <param name="progressTime">已進行動畫時間/總動畫時間</param>
    /// <param name="power">動畫曲線冪(默認值3)</param>
    /// <param name="amplitude">收縮與相關聯的幅度動畫。此值必須大於或等於 0。 默認值為 1。</param>
    /// <returns></returns>
    public static double BackInCore(double progressTime, double power, double amplitude)
    {
      amplitude = Math.Max(0.0, amplitude);
      return Math.Pow(progressTime, power) - progressTime * amplitude * Math.Sin(Math.PI * progressTime);
    }
    /// <summary>
    /// 收縮
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <param name="power">動畫曲線冪(默認值3)</param>
    /// <param name="amplitude">收縮與相關聯的幅度動畫。此值必須大於或等於 0。 默認值為 1。</param>
    /// <returns></returns>
    public static double BackOut(double origin, double transform, double usedTime, double allTime, double power, double amplitude)
    {
      return origin + transform * BackOutCore((usedTime / allTime), power, amplitude);
    }
    /// <summary>
    /// 收縮
    /// </summary>
    /// <param name="progressTime">已進行動畫時間/總動畫時間</param>
    /// <param name="power">動畫曲線冪(默認值3)</param>
    /// <param name="amplitude">收縮與相關聯的幅度動畫。此值必須大於或等於 0。 默認值為 1。</param>
    /// <returns></returns>
    public static double BackOutCore(double progressTime, double power, double amplitude)
    {
      return 1.0 - BackInCore(1.0 - progressTime, power, amplitude);
    }
    /// <summary>
    /// 收縮
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <param name="power">動畫曲線冪(默認值3)</param>
    /// <param name="amplitude">收縮與相關聯的幅度動畫。此值必須大於或等於 0。 默認值為 1。</param>
    /// <returns></returns>
    public static double BackBoth(double origin, double transform, double usedTime, double allTime, double power, double amplitude)
    {
      return origin + transform * BackBothCore(usedTime / allTime, power, amplitude);
    }
    /// <summary>
    /// 收縮
    /// </summary>
    /// <param name="progressTime">已進行動畫時間/總動畫時間</param>
    /// <param name="power">動畫曲線冪(默認值3)</param>
    /// <param name="amplitude">收縮與相關聯的幅度動畫。此值必須大於或等於 0。 默認值為 1。</param>
    /// <returns></returns>
    public static double BackBothCore(double progressTime, double power, double amplitude)
    {
      if (progressTime >= 0.5)
        return (1.0 - BackInCore((1.0 - progressTime) * 2.0, power, amplitude)) * 0.5 + 0.5;
      return BackInCore(progressTime * 2.0, power, amplitude) * 0.5;
    }

    #endregion

    #region Bounce

    /// <summary>
    /// 彈球減振 加速
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <param name="bounces">反彈次數。值必須大於或等於零(默認值為3)</param>
    /// <param name="bounciness">指定反彈動畫的彈性大小。雖然較高的值都會導致反彈 (彈性較小),此屬性中的結果很少或者反彈低值會丟失反彈 (彈性較大) 之間的高度。此值必須是正數(默認值為 2)</param>
    /// <returns></returns>
    public static double BounceIn(double origin, double transform, double usedTime, double allTime, int bounces, double bounciness)
    {
      return origin + transform * BounceInCore((usedTime / allTime), bounces, bounciness);
    }
    /// <summary>
    /// 彈球減振 加速
    /// </summary>
    /// <param name="progressTime">已進行動畫時間/總動畫時間</param>
    /// <param name="bounces">反彈次數。值必須大於或等於零(默認值為3)</param>
    /// <param name="bounciness">指定反彈動畫的彈性大小。雖然較高的值都會導致反彈 (彈性較小),此屬性中的結果很少或者反彈低值會丟失反彈 (彈性較大) 之間的高度。此值必須是正數(默認值為 2)</param>
    /// <returns></returns>
    public static double BounceInCore(double progressTime, int bounces, double bounciness)
    {
      double y1 = Math.Max(0.0, (double)bounces);
      double num1 = bounciness;
      if (num1 < 1.0 || Math.Abs(num1 - 1.0) < 2.22044604925031E-15)
        num1 = 1001.0 / 1000.0;
      double num2 = Math.Pow(num1, y1);
      double num3 = 1.0 - num1;
      double num4 = (1.0 - num2) / num3 + num2 * 0.5;
      double y2 = Math.Floor(Math.Log(-(progressTime * num4) * (1.0 - num1) + 1.0, num1));
      double y3 = y2 + 1.0;
      double num5 = (1.0 - Math.Pow(num1, y2)) / (num3 * num4);
      double num6 = (1.0 - Math.Pow(num1, y3)) / (num3 * num4);
      double num7 = (num5 + num6) * 0.5;
      double num8 = progressTime - num7;
      double num9 = num7 - num5;
      return -Math.Pow(1.0 / num1, y1 - y2) / (num9 * num9) * (num8 - num9) * (num8 + num9);
    }
    /// <summary>
    /// 加速 彈球減振
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <param name="bounces">反彈次數。值必須大於或等於零(默認值為3)</param>
    /// <param name="bounciness">指定反彈動畫的彈性大小。雖然較高的值都會導致反彈 (彈性較小),此屬性中的結果很少或者反彈低值會丟失反彈 (彈性較大) 之間的高度。此值必須是正數(默認值為 2)</param>
    /// <returns></returns>
    public static double BounceOut(double origin, double transform, double usedTime, double allTime, int bounces, double bounciness)
    {
      return origin + transform * BounceOutCore((usedTime / allTime), bounces, bounciness);
    }
    /// <summary>
    /// 加速 彈球減振
    /// </summary>
    /// <param name="progressTime">已進行動畫時間/總動畫時間</param>
    /// <param name="bounces">反彈次數。值必須大於或等於零(默認值為3)</param>
    /// <param name="bounciness">指定反彈動畫的彈性大小。雖然較高的值都會導致反彈 (彈性較小),此屬性中的結果很少或者反彈低值會丟失反彈 (彈性較大) 之間的高度。此值必須是正數(默認值為 2)</param>
    /// <returns></returns>
    public static double BounceOutCore(double progressTime, int bounces, double bounciness)
    {
      return 1.0 - BounceInCore(1.0 - progressTime, bounces, bounciness);
    }
    /// <summary>
    /// 彈球減振 加速 彈球減振
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <param name="bounces">反彈次數。值必須大於或等於零(默認值為3)</param>
    /// <param name="bounciness">指定反彈動畫的彈性大小。雖然較高的值都會導致反彈 (彈性較小),此屬性中的結果很少或者反彈低值會丟失反彈 (彈性較大) 之間的高度。此值必須是正數(默認值為 2)</param>
    /// <returns></returns>
    public static double BounceBoth(double origin, double transform, double usedTime, double allTime, int bounces, double bounciness)
    {
      return origin + transform * BounceBothCore(usedTime / allTime, bounces, bounciness);
    }
    /// <summary>
    /// 彈球減振 加速 彈球減振
    /// </summary>
    /// <param name="progressTime">已進行動畫時間/總動畫時間</param>
    /// <param name="bounces">反彈次數。值必須大於或等於零(默認值為3)</param>
    /// <param name="bounciness">指定反彈動畫的彈性大小。雖然較高的值都會導致反彈 (彈性較小),此屬性中的結果很少或者反彈低值會丟失反彈 (彈性較大) 之間的高度。此值必須是正數(默認值為 2)</param>
    /// <returns></returns>
    public static double BounceBothCore(double progressTime, int bounces, double bounciness)
    {
      if (progressTime >= 0.5)
        return (1.0 - BounceInCore((1.0 - progressTime) * 2.0, bounces, bounciness)) * 0.5 + 0.5;
      return BounceInCore(progressTime * 2.0, bounces, bounciness) * 0.5;
    }

    #endregion

    #region Elastic

    /// <summary>
    /// Elastic
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <param name="oscillations">目標來回滑過動畫目標的次數。此值必須大於或等於0 (默認值為3)</param>
    /// <param name="springiness">彈簧鍘度。 越小的 Springiness 值為,嚴格 spring,通過每個振動的強度減小的速度越快彈性。一個正數(默認值為3)</param>
    /// <returns></returns>
    public static double ElasticIn(double origin, double transform, double usedTime, double allTime, int oscillations, double springiness)
    {
      return origin + transform * ElasticInCore((usedTime / allTime), oscillations, springiness);
    }
    /// <summary>
    /// Elastic
    /// </summary>
    /// <param name="progressTime">已進行動畫時間/總動畫時間</param>
    /// <param name="oscillations">目標來回滑過動畫目標的次數。此值必須大於或等於0 (默認值為3)</param>
    /// <param name="springiness">彈簧鍘度。 越小的 Springiness 值為,嚴格 spring,通過每個振動的強度減小的速度越快彈性。一個正數(默認值為3)</param>
    /// <returns></returns>
    public static double ElasticInCore(double progressTime, int oscillations, double springiness)
    {
      oscillations = Math.Max(0, oscillations);
      springiness = Math.Max(0.0, springiness);
      return (!(Math.Abs(springiness) < 2.22044604925031E-15) ? (Math.Exp(springiness * progressTime) - 1.0) / (Math.Exp(springiness) - 1.0) : progressTime) * Math.Sin((2.0 * Math.PI * oscillations + Math.PI / 2.0) * progressTime);
    }
    /// <summary>
    /// Elastic
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <param name="oscillations">目標來回滑過動畫目標的次數。此值必須大於或等於0 (默認值為3)</param>
    /// <param name="springiness">彈簧鍘度。 越小的 Springiness 值為,嚴格 spring,通過每個振動的強度減小的速度越快彈性。一個正數(默認值為3)</param>
    /// <returns></returns>
    public static double ElasticOut(double origin, double transform, double usedTime, double allTime, int oscillations, double springiness)
    {
      return origin + transform * ElasticOutCore((usedTime / allTime), oscillations, springiness);
    }
    /// <summary>
    /// Elastic
    /// </summary>
    /// <param name="progressTime">已進行動畫時間/總動畫時間</param>
    /// <param name="oscillations">目標來回滑過動畫目標的次數。此值必須大於或等於0 (默認值為3)</param>
    /// <param name="springiness">彈簧鍘度。 越小的 Springiness 值為,嚴格 spring,通過每個振動的強度減小的速度越快彈性。一個正數(默認值為3)</param>
    /// <returns></returns>
    public static double ElasticOutCore(double progressTime, int oscillations, double springiness)
    {
      return 1.0 - ElasticInCore(1.0 - progressTime, oscillations, springiness);
    }
    /// <summary>
    /// Elastic
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <param name="oscillations">目標來回滑過動畫目標的次數。此值必須大於或等於0 (默認值為3)</param>
    /// <param name="springiness">彈簧鍘度。 越小的 Springiness 值為,嚴格 spring,通過每個振動的強度減小的速度越快彈性。一個正數(默認值為3)</param>
    /// <returns></returns>
    public static double ElasticBoth(double origin, double transform, double usedTime, double allTime, int oscillations, double springiness)
    {
      return origin + transform * ElasticBothCore(usedTime / allTime, oscillations, springiness);
    }
    /// <summary>
    /// Elastic
    /// </summary>
    /// <param name="progressTime">已進行動畫時間/總動畫時間</param>
    /// <param name="oscillations">目標來回滑過動畫目標的次數。此值必須大於或等於0 (默認值為3)</param>
    /// <param name="springiness">彈簧鍘度。 越小的 Springiness 值為,嚴格 spring,通過每個振動的強度減小的速度越快彈性。一個正數(默認值為3)</param>
    /// <returns></returns>
    public static double ElasticBothCore(double progressTime, int oscillations, double springiness)
    {
      if (progressTime >= 0.5)
        return (1.0 - ElasticInCore((1.0 - progressTime) * 2.0, oscillations, springiness)) * 0.5 + 0.5;
      return ElasticInCore(progressTime * 2.0, oscillations, springiness) * 0.5;
    }

    #endregion

    #region Quadratic

    /// <summary>
    /// 二次
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <returns></returns>
    public static double QuadraticIn(double origin, double transform, double usedTime, double allTime)
    {
      return origin + transform * QuadraticInCore(usedTime / allTime);
    }
    /// <summary>
    /// 二次
    /// </summary>
    /// <param name="progressTime">已進行動畫時間/總動畫時間</param>
    /// <returns></returns>
    public static double QuadraticInCore(double progressTime)
    {
      return -4 * Math.Pow((progressTime - 0.5), 2.0) + 1.0;
    }
    /// <summary>
    /// 二次
    /// </summary>
    /// <param name="origin">要變換的起始值</param>
    /// <param name="transform">要變換的總值</param>
    /// <param name="usedTime">已進行動畫時間</param>
    /// <param name="allTime">總動畫時間</param>
    /// <returns></returns>
    public static double QuadraticOut(double origin, double transform, double usedTime, double allTime)
    {
      return origin + transform * QuadraticOutCore(usedTime / allTime);
    }
    /// <summary>
    /// 二次
    /// </summary>
    /// <param name="progressTime">已進行動畫時間/總動畫時間</param>
    /// <returns></returns>
    public static double QuadraticOutCore(double progressTime)
    {
      if (progressTime >= 0.5)
      {
        return 4 * Math.Pow((progressTime - 0.5 - 0.5), 2.0);
      }
      return 4 * Math.Pow((progressTime), 2.0);
    }

    #endregion

  }

源碼下載地址:動畫效果.zip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM