public class InitialDrawable extends ShapeDrawable { private final Paint textPaint; private final Paint borderPaint; private static final float SHADE_FACTOR = 0.9f; private final String text; private final int color; private final int height; private final int width; private final int fontSize; private final float radius; private final int borderThickness; private InitialDrawable(Builder builder) { super(new OvalShape()); height = builder.height; width = builder.width; radius = builder.radius; text = builder.toUpperCase ? builder.text.toUpperCase() : builder.text; color = builder.color; fontSize = builder.fontSize; textPaint = new Paint(); textPaint.setColor(builder.textColor); textPaint.setAntiAlias(true); textPaint.setFakeBoldText(builder.isBold); textPaint.setStyle(Paint.Style.FILL); textPaint.setTypeface(builder.font); textPaint.setTextAlign(Paint.Align.CENTER); textPaint.setStrokeWidth(builder.borderThickness); borderThickness = builder.borderThickness; borderPaint = new Paint(); borderPaint.setColor(getDarkerShade(color)); borderPaint.setStyle(Paint.Style.STROKE); borderPaint.setStrokeWidth(borderThickness); Paint paint = getPaint(); paint.setColor(color); } private int getDarkerShade(int color) { return Color.rgb((int)(SHADE_FACTOR * Color.red(color)), (int)(SHADE_FACTOR * Color.green(color)), (int)(SHADE_FACTOR * Color.blue(color))); } @Override public void draw(Canvas canvas) { super.draw(canvas); Rect r = getBounds(); if (borderThickness > 0) { RectF rect = new RectF(getBounds()); rect.inset(borderThickness / 2, borderThickness / 2); canvas.drawOval(rect, borderPaint); } int count = canvas.save(); canvas.translate(r.left, r.top); int width = this.width < 0 ? r.width() : this.width; int height = this.height < 0 ? r.height() : this.height; int fontSize = this.fontSize < 0 ? (Math.min(width, height) / 2) : this.fontSize; textPaint.setTextSize(fontSize); canvas.drawText(text, width / 2, height / 2 - ((textPaint.descent() + textPaint.ascent()) / 2), textPaint); canvas.restoreToCount(count); } @Override public void setAlpha(int alpha) { textPaint.setAlpha(alpha); } @Override public void setColorFilter(ColorFilter cf) { textPaint.setColorFilter(cf); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } @Override public int getIntrinsicWidth() { return width; } @Override public int getIntrinsicHeight() { return height; } public static Builder builder() { return new Builder(); } public static class Builder { private String text; private int color; private int borderThickness; private int width; private int height; private Typeface font; public int textColor; private int fontSize; private boolean isBold; private boolean toUpperCase; public float radius; private Builder() { text = ""; color = Color.GRAY; textColor = Color.WHITE; borderThickness = 0; width = -1; height = -1; font = Typeface.create("sans-serif-light", Typeface.NORMAL); fontSize = -1; isBold = false; toUpperCase = false; } public Builder width(int width) { this.width = width; return this; } public Builder height(int height) { this.height = height; return this; } public Builder textColor(int color) { this.textColor = color; return this; } public Builder withBorder(int thickness) { this.borderThickness = thickness; return this; } public Builder useFont(Typeface font) { this.font = font; return this; } public Builder fontSize(int size) { this.fontSize = size; return this; } public Builder bold() { this.isBold = true; return this; } public Builder toUpperCase() { this.toUpperCase = true; return this; } public InitialDrawable build(String text, int color) { this.color = color; this.text = text; return new InitialDrawable(this); } } }