summaryrefslogtreecommitdiff
path: root/org.fox.ttrss/src/main/java/com/amulyakhare/textdrawable/TextDrawable.java
diff options
context:
space:
mode:
Diffstat (limited to 'org.fox.ttrss/src/main/java/com/amulyakhare/textdrawable/TextDrawable.java')
-rw-r--r--org.fox.ttrss/src/main/java/com/amulyakhare/textdrawable/TextDrawable.java316
1 files changed, 316 insertions, 0 deletions
diff --git a/org.fox.ttrss/src/main/java/com/amulyakhare/textdrawable/TextDrawable.java b/org.fox.ttrss/src/main/java/com/amulyakhare/textdrawable/TextDrawable.java
new file mode 100644
index 00000000..db42f8b7
--- /dev/null
+++ b/org.fox.ttrss/src/main/java/com/amulyakhare/textdrawable/TextDrawable.java
@@ -0,0 +1,316 @@
+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 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;
+
+ // 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.setStyle(Paint.Style.STROKE);
+ borderPaint.setStrokeWidth(borderThickness);
+
+ // 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);
+
+ 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 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;
+ 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) {
+ this.borderThickness = thickness;
+ 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);
+
+ 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);
+ }
+} \ No newline at end of file