package at.favre.lib.dali.builder.animation;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.widget.ImageView;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* Created by PatrickF on 29.05.2014.
*/
public class BlurKeyFrameTransitionAnimation {
private final static String TAG = BlurKeyFrameTransitionAnimation.class.getSimpleName();
private List<TransitionDrawable> transitionDrawables = new ArrayList<TransitionDrawable>();
private Context ctx;
private Handler handler = new Handler(Looper.getMainLooper());
private BlurKeyFrameManager manager;
private List<Runnable> runnables;
private boolean running = false;
private boolean canceled = false;
private KeyFrameAnimationListener listener;
public BlurKeyFrameTransitionAnimation(Context ctx, BlurKeyFrameManager manager) {
this.ctx = ctx;
this.manager = manager;
this.runnables= new CopyOnWriteArrayList<Runnable>();
}
public void prepareAnimation(Bitmap original) {
BlurKeyFrameManager.KeyFrameData data = manager.prepareFrames(ctx,original);
transitionDrawables = new ArrayList<TransitionDrawable>();
for (int i = 0; i < data.getFrames().size(); i++) {
if(i+1 < data.getFrames().size()) {
TransitionDrawable t = new TransitionDrawable(new Drawable[]{new BitmapDrawable(ctx.getResources(),data.getFrames().get(i)),new BitmapDrawable(ctx.getResources(),data.getFrames().get(i+1))});
transitionDrawables.add(t);
}
}
}
public void start(final ImageView imageView) {
if(listener != null) {
listener.onAnimationStart();
}
long duration = 0;
for (int i = 0; i < transitionDrawables.size(); i++) {
final int iterator = i;
handler.postDelayed(new Runnable() {
@Override
public void run() {
TransitionDrawable t = transitionDrawables.get(iterator);
t.startTransition(manager.getKeyFrames().get(iterator).getDuration());
imageView.setImageDrawable(t);
Log.d(TAG,"transition "+iterator );
}
},duration);
duration += manager.getKeyFrames().get(i).getDuration();
}
handler.postDelayed(new Runnable() {
@Override
public void run() {
Log.d(TAG,"reset animation");
for (TransitionDrawable transitionDrawable : transitionDrawables) {
transitionDrawable.resetTransition();
}
if(listener != null) {
listener.onAnimationEnd();
}
}
},duration);
}
public synchronized void cancel() {
this.canceled = true;
this.running = false;
}
public static interface KeyFrameAnimationListener {
public void onAnimationStart();
public void onKeyFrameChange(int keyFrameNo);
public void onAnimationEnd();
}
}