package com.bootstrap.drawable;
import android.animation.ValueAnimator;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import com.bootstrap.utils.ColorUtils;
public final class ColorFadeDrawable extends Drawable {
private final int colorFrom;
private final int colorTo;
private final Paint paint;
private long startDelay;
public ColorFadeDrawable(final int colorFrom, final int colorTo) {
this.colorFrom = colorFrom;
this.colorTo = colorTo;
this.paint = new Paint();
paint.setColor(colorFrom);
}
public ColorFadeDrawable fadeFrom(final long duration) {
fade(duration, false);
return this;
}
public ColorFadeDrawable fadeTo(final long duration) {
fade(duration, true);
return this;
}
public ColorFadeDrawable startDelay(final long startDelay) {
this.startDelay = startDelay;
return this;
}
public ColorFadeDrawable toggle(final long duration) {
if (paint.getColor() == colorFrom) fadeTo(duration);
else fadeFrom(duration);
return this;
}
private void fade(final long duration, final boolean exit) {
final ValueAnimator animator = ValueAnimator.ofInt(0);
animator.setDuration(duration);
animator.setInterpolator(exit ? new DecelerateInterpolator() : new AccelerateInterpolator());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override public void onAnimationUpdate(final ValueAnimator animation) {
paint.setColor(ColorUtils.crossFade(animation.getAnimatedFraction(),
exit ? colorFrom : colorTo, exit ? colorTo : colorFrom));
invalidateSelf();
}
});
animator.setStartDelay(startDelay);
animator.start();
}
@Override public void draw(final Canvas canvas) {
canvas.drawPaint(paint);
}
@Override public void setAlpha(final int alpha) {
// not used
}
@Override public void setColorFilter(final ColorFilter cf) {
// not used
}
@Override public int getOpacity() {
return 0;
}
}