package it.sephiroth.android.library.easing; public class Elastic implements Easing { @Override public double easeIn(double time, double start, double end, double duration) { return easeIn(time, start, end, duration, start + end, duration); } public double easeIn(double t, double b, double c, double d, double a, double p) { double s; if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!(p > 0)) p = d * .3; if (!(a > 0) || 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 -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; } @Override public double easeOut(double time, double start, double end, double duration) { return easeOut(time, start, end, duration, start + end, duration); } public double easeOut(double t, double b, double c, double d, double a, double p) { double s; if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!(p > 0)) p = d * .3; if (!(a > 0) || 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); } @Override public double easeInOut(double t, double b, double c, double d) { return easeInOut(t, b, c, d, b + c, d); } public double easeInOut(double t, double b, double c, double d, double a, double p) { double s; if (t == 0) return b; if ((t /= d / 2) == 2) return b + c; if (!(p > 0)) p = d * (.3 * 1.5); if (!(a > 0) || 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; } }