Last active
November 25, 2018 15:48
-
-
Save jossiwolf/3333379af7901771fc75 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.amulyakhare.textdrawable; | |
import android.graphics.*; | |
import android.graphics.drawable.ShapeDrawable; | |
import android.graphics.drawable.shapes.OvalShape; | |
import android.graphics.drawable.shapes.RectShape; | |
import android.graphics.drawable.shapes.RoundRectShape; | |
/** | |
* @author amulya | |
* @datetime 14 Oct 2014, 3:53 PM | |
*/ | |
public class TextDrawable 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 borderColor; | |
private final RectShape shape; | |
private final int height; | |
private final int width; | |
private final int fontSize; | |
private final float radius; | |
private final int borderThickness; | |
private TextDrawable(Builder builder) { | |
super(builder.shape); | |
// shape properties | |
shape = builder.shape; | |
height = builder.height; | |
width = builder.width; | |
radius = builder.radius; | |
// text and color | |
text = builder.toUpperCase ? builder.text.toUpperCase() : builder.text; | |
color = builder.color; | |
borderColor = builder.borderColor; | |
// text paint settings | |
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); | |
// border paint settings | |
borderThickness = builder.borderThickness; | |
borderPaint = new Paint(); | |
//borderPaint.setColor(getDarkerShade(color)); | |
borderPaint.setColor(borderColor); | |
borderPaint.setStyle(Paint.Style.STROKE); | |
borderPaint.setStrokeWidth(borderThickness); | |
//borderPaint.set | |
// drawable paint color | |
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(); | |
// draw border | |
if (borderThickness > 0) { | |
drawBorder(canvas); | |
} | |
int count = canvas.save(); | |
canvas.translate(r.left, r.top); | |
// draw text | |
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); | |
} | |
private void drawBorder(Canvas canvas) { | |
RectF rect = new RectF(getBounds()); | |
rect.inset(borderThickness/2, borderThickness/2); | |
//rect.inset(borderThickness, borderThickness); | |
if (shape instanceof OvalShape) { | |
canvas.drawOval(rect, borderPaint); | |
} | |
else if (shape instanceof RoundRectShape) { | |
canvas.drawRoundRect(rect, radius, radius, borderPaint); | |
} | |
else { | |
canvas.drawRect(rect, borderPaint); | |
} | |
} | |
@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 IShapeBuilder builder() { | |
return new Builder(); | |
} | |
public static class Builder implements IConfigBuilder, IShapeBuilder, IBuilder { | |
private String text; | |
private int color; | |
private int borderColor; | |
private int borderThickness; | |
private int width; | |
private int height; | |
private Typeface font; | |
private RectShape shape; | |
public int textColor; | |
private int fontSize; | |
private boolean isBold; | |
private boolean toUpperCase; | |
public float radius; | |
private Builder() { | |
text = ""; | |
color = Color.GRAY; | |
borderColor = Color.RED; | |
textColor = Color.WHITE; | |
borderThickness = 0; | |
width = -1; | |
height = -1; | |
shape = new RectShape(); | |
font = Typeface.create("sans-serif-light", Typeface.NORMAL); | |
fontSize = -1; | |
isBold = false; | |
toUpperCase = false; | |
} | |
public IConfigBuilder width(int width) { | |
this.width = width; | |
return this; | |
} | |
public IConfigBuilder height(int height) { | |
this.height = height; | |
return this; | |
} | |
public IConfigBuilder textColor(int color) { | |
this.textColor = color; | |
return this; | |
} | |
public IConfigBuilder withBorder(int thickness, int borderColor) { | |
this.borderThickness = thickness; | |
this.borderColor = borderColor; | |
return this; | |
} | |
public IConfigBuilder withBorder(int thickness, String borderColor) { | |
this.borderThickness = thickness; | |
this.borderColor = Color.parseColor(borderColor); | |
return this; | |
} | |
public IConfigBuilder useFont(Typeface font) { | |
this.font = font; | |
return this; | |
} | |
public IConfigBuilder fontSize(int size) { | |
this.fontSize = size; | |
return this; | |
} | |
public IConfigBuilder bold() { | |
this.isBold = true; | |
return this; | |
} | |
public IConfigBuilder toUpperCase() { | |
this.toUpperCase = true; | |
return this; | |
} | |
@Override | |
public IConfigBuilder beginConfig() { | |
return this; | |
} | |
@Override | |
public IShapeBuilder endConfig() { | |
return this; | |
} | |
@Override | |
public IBuilder rect() { | |
this.shape = new RectShape(); | |
return this; | |
} | |
@Override | |
public IBuilder round() { | |
this.shape = new OvalShape(); | |
return this; | |
} | |
@Override | |
public IBuilder roundRect(int radius) { | |
this.radius = radius; | |
float[] radii = {radius, radius, radius, radius, radius, radius, radius, radius}; | |
this.shape = new RoundRectShape(radii, null, null); | |
return this; | |
} | |
@Override | |
public TextDrawable buildRect(String text, int color) { | |
rect(); | |
return build(text, color); | |
} | |
@Override | |
public TextDrawable buildRoundRect(String text, int color, int radius) { | |
roundRect(radius); | |
return build(text, color); | |
} | |
@Override | |
public TextDrawable buildRound(String text, int color) { | |
round(); | |
return build(text, color); | |
} | |
@Override | |
public TextDrawable build(String text, int color) { | |
this.color = color; | |
this.text = text; | |
return new TextDrawable(this); | |
} | |
} | |
public interface IConfigBuilder { | |
public IConfigBuilder width(int width); | |
public IConfigBuilder height(int height); | |
public IConfigBuilder textColor(int color); | |
public IConfigBuilder withBorder(int thickness, int borderColor); | |
public IConfigBuilder withBorder(int thickness, String borderColor); | |
public IConfigBuilder useFont(Typeface font); | |
public IConfigBuilder fontSize(int size); | |
public IConfigBuilder bold(); | |
public IConfigBuilder toUpperCase(); | |
public IShapeBuilder endConfig(); | |
} | |
public static interface IBuilder { | |
public TextDrawable build(String text, int color); | |
} | |
public static interface IShapeBuilder { | |
public IConfigBuilder beginConfig(); | |
public IBuilder rect(); | |
public IBuilder round(); | |
public IBuilder roundRect(int radius); | |
public TextDrawable buildRect(String text, int color); | |
public TextDrawable buildRoundRect(String text, int color, int radius); | |
public TextDrawable buildRound(String text, int color); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for colored border.