package it.sephiroth.android.library.imagezoom.test.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; } }