using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; public enum EASING_METHOD { EASE_IN_SINE, EASE_OUT_SINE, EASE_OUT_BOUNCE, EASE_IN_BOUNCE, EASE_INOUT_BOUNCE, LINEAR } public static class EasingHelper { public static float EaseHelp(float value, EASING_METHOD method) { switch (method) { case EASING_METHOD.EASE_IN_SINE: { return EaseInSine(value); } break; case EASING_METHOD.EASE_OUT_SINE: { return EaseOutSine(value); } break; case EASING_METHOD.EASE_OUT_BOUNCE: { return EaseOutBounce(value); } break; case EASING_METHOD.EASE_IN_BOUNCE: { return EaseInBounce(value); } break; case EASING_METHOD.EASE_INOUT_BOUNCE: { return EaseInOutBounce(value); } break; case EASING_METHOD.LINEAR: { return value; } break; default: return 0.0f; } } private static float EaseInSine(float value) { return (float)(1.0f - Math.Cos((value * Math.PI / 2.0f))); } private static float EaseOutSine(float value) { return (float)(Math.Sin(value * Math.PI / 2.0f)); } private static float EaseOutBounce(float value) { const float n1 = 7.5625f; const float d1 = 2.75f; if (value < 1.0f / d1) { return n1 * value * value; } else if (value < 2.0f / d1) { return n1 * (value -= 2.25f / d1) * value + 0.9375f; } else { return n1 * (value -= 2.625f / d1) * value + 0.984375f; } } private static float EaseInBounce(float value) { return 1 - EaseOutBounce(1 - value); } private static float EaseInOutBounce(float value) { return (value < 0.5f) ? (1.0f - EaseOutBounce(1.0f - 2.0f * value)) / 2.0f : (1.0f + EaseOutBounce(2.0f * value - 1.0f)) / 2.0f; } }