package it.sephiroth.android.library.bottomnavigation.app.providers; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.annotation.IdRes; import java.util.HashMap; import it.sephiroth.android.library.bottomnavigation.BadgeProvider; import it.sephiroth.android.library.bottomnavigation.BottomNavigation; public class CustomBadgeProvider extends BadgeProvider { private final HashMap<Integer, Integer> countMap = new HashMap<>(); public CustomBadgeProvider(final BottomNavigation navigation) { super(navigation); } public int getBadgeTextCount(@IdRes final int itemId) { if (countMap.containsKey(itemId)) { return countMap.get(itemId); } return 0; } public void show(@IdRes final int itemId, int count) { countMap.put(itemId, count); super.show(itemId); } @Override public void remove(@IdRes final int itemId) { countMap.remove(itemId); super.remove(itemId); } @Override protected Drawable newDrawable(@IdRes final int itemId, final int preferredColor) { int count = 1; if (countMap.containsKey(itemId)) { count = countMap.get(itemId); } return new Badge(preferredColor, count); } public static final class Badge extends Drawable { final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); final Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.LINEAR_TEXT_FLAG | Paint.SUBPIXEL_TEXT_FLAG); private String text; private float top; private float left; public Badge(final int color, final int count) { super(); this.text = String.valueOf(count); paint.setColor(color); textPaint.setColor(Color.WHITE); textPaint.setTextSize(24); } @Override public void draw(final Canvas canvas) { final Rect rect = getBounds(); canvas.drawCircle(rect.centerX(), rect.centerY(), rect.width() / 2, paint); canvas.drawText(text, 0, text.length(), left, top, textPaint); } @Override protected void onBoundsChange(final Rect bounds) { super.onBoundsChange(bounds); bounds.offset(bounds.width() / 2, -bounds.height() / 2); Paint.FontMetrics metrics = textPaint.getFontMetrics(); float size = textPaint.measureText(text, 0, text.length()); left = (bounds.left + (bounds.width() - size) / 2); top = bounds.centerY() - (metrics.ascent / 2) - metrics.descent / 2; } @Override public void setAlpha(final int alpha) { paint.setAlpha(alpha); textPaint.setAlpha(alpha); } @Override public void setColorFilter(final ColorFilter colorFilter) { } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } @Override public int getIntrinsicWidth() { return 50; } @Override public int getIntrinsicHeight() { return 50; } } }