package com.qozix.animation;
import java.util.ArrayList;
import android.os.Handler;
import android.os.Message;
import com.qozix.animation.easing.EasingEquation;
import com.qozix.animation.easing.Linear;
public class Tween {
private double ellapsed;
private double startTime;
private double duration = 500;
private ArrayList<TweenListener> listeners = new ArrayList<TweenListener>();
private EasingEquation ease = Linear.EaseNone;
public double getProgress() {
return ellapsed / duration;
}
public double getEasedProgress() {
return ease.compute( ellapsed, 0, 1, duration );
}
public void setAnimationEase( EasingEquation e ) {
if ( e == null ) {
e = Linear.EaseNone;
}
ease = e;
}
public void addTweenListener( TweenListener l ) {
listeners.add( l );
}
public void removeTweenListener( TweenListener l ) {
listeners.remove( l );
}
public double getDuration() {
return duration;
}
public void setDuration( double time ) {
duration = time;
}
public void start() {
stop();
ellapsed = 0;
startTime = System.currentTimeMillis();
for ( TweenListener l : listeners ) {
l.onTweenStart();
}
handler.sendEmptyMessage( 0 );
}
public void stop() {
if ( handler.hasMessages( 0 ) ) {
handler.removeMessages( 0 );
}
}
private Handler handler = new Handler() {
@Override
public void handleMessage( final Message message ) {
ellapsed = System.currentTimeMillis() - startTime;
ellapsed = Math.min( ellapsed, duration );
double progress = getProgress();
double eased = getEasedProgress();
for ( TweenListener l : listeners ) {
l.onTweenProgress( progress, eased );
}
if ( ellapsed >= duration ) {
if ( hasMessages( 0 ) ) {
removeMessages( 0 );
}
for ( TweenListener l : listeners ) {
l.onTweenComplete();
}
} else {
sendEmptyMessage( 0 );
}
}
};
}