package it.sephiroth.android.library.bottomnavigation; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.SystemClock; /** * Created by crugnola on 4/12/16. */ public class BadgeDrawable extends Drawable { private static final String TAG = BadgeDrawable.class.getSimpleName(); public static final float FADE_DURATION = 100f; public static final float ALPHA_MAX = 255f; private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); private long startTimeMillis; private boolean animating; private final int size; public BadgeDrawable(final int color, final int size) { super(); this.paint.setColor(color); this.size = size; this.animating = true; this.startTimeMillis = 0; } public void setIsAnimating(boolean animating) { this.animating = animating; } @Override public void draw(final Canvas canvas) { if (!animating) { paint.setAlpha((int) ALPHA_MAX); drawInternal(canvas); } else { if (startTimeMillis == 0) { startTimeMillis = SystemClock.uptimeMillis(); } float normalized = (SystemClock.uptimeMillis() - startTimeMillis) / FADE_DURATION; if (normalized >= 1f) { animating = false; paint.setAlpha((int) ALPHA_MAX); drawInternal(canvas); } else { int partialAlpha = (int) (ALPHA_MAX * normalized); setAlpha(partialAlpha); drawInternal(canvas); } } } private void drawInternal(final Canvas canvas) { Rect bounds = getBounds(); final int w = bounds.width(); final int h = bounds.height(); canvas.drawCircle(bounds.centerX() + w / 2, bounds.centerY() - h / 2, w / 2, paint); } @Override public void setAlpha(final int alpha) { paint.setAlpha(alpha); invalidateSelf(); } @Override public int getAlpha() { return paint.getAlpha(); } @Override public boolean isStateful() { return false; } @Override public void setColorFilter(final ColorFilter colorFilter) { paint.setColorFilter(colorFilter); invalidateSelf(); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } @Override public int getIntrinsicHeight() { return size; } @Override public int getIntrinsicWidth() { return size; } }