package com.marshalchen.common.uimodule.tileView.animation;
import android.os.Handler;
import android.os.Message;
import com.marshalchen.common.uimodule.tileView.animation.easing.EasingEquation;
import com.marshalchen.common.uimodule.tileView.animation.easing.Linear;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class Animator {
private double ellapsed;
private double startTime;
private double duration = 500;
private HashMap<String, Double> properties = new HashMap<String, Double>();
private HashMap<String, Double> values = new HashMap<String, Double>();
private ArrayList<AnimationListener> listeners = new ArrayList<AnimationListener>();
private EasingEquation ease = Linear.EaseNone;
public void setAnimationEase(EasingEquation e) {
if(e == null || !( e instanceof EasingEquation)){
e = Linear.EaseNone;
}
ease = e;
}
public void addAnimationListener(AnimationListener l) {
listeners.add(l);
}
public void removeAnimationListener(AnimationListener l){
listeners.remove(l);
}
public double getDuration() {
return duration;
}
public void setDuration(double time) {
duration = time;
}
public HashMap<String, Double> getProperties() {
return properties;
}
public void setProperties(HashMap<String, Double> p) {
properties = p;
}
public void addProperties(HashMap<String, Double> p){
properties.putAll(p);
}
public void addProperty(String s, Double d){
properties.put(s, d);
}
public void start() {
values.putAll(properties);
ellapsed = 0;
startTime = System.currentTimeMillis();
handler.sendEmptyMessage(0);
for(AnimationListener l : listeners){
l.onAnimationStart();
}
}
private Handler handler = new Handler() {
@Override
public void handleMessage(final Message message) {
ellapsed = System.currentTimeMillis() - startTime;
for(Map.Entry<String, Double> e : values.entrySet()) {
String key = e.getKey();
Double value = e.getValue();
Double originalValue = properties.get(key);
Double computedValue = ease.compute(ellapsed, originalValue, originalValue - value, duration);
e.setValue(computedValue);
}
for(AnimationListener l : listeners){
l.onAnimationProgress(values);
}
if (ellapsed >= duration) {
if (hasMessages(0)) {
removeMessages(0);
}
for(AnimationListener l : listeners){
l.onAnimationComplete();
}
} else {
sendEmptyMessage(0);
}
}
};
}