Skip to content

Instantly share code, notes, and snippets.

@staakk
Created September 14, 2017 12:45
Show Gist options
  • Save staakk/d9bba54fa1e4d8951723856521b82278 to your computer and use it in GitHub Desktop.
Save staakk/d9bba54fa1e4d8951723856521b82278 to your computer and use it in GitHub Desktop.
[Android] Custom drawable for displaying solid color with border
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.ColorInt;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class BackgroundDrawable extends Drawable {
public static final int BORDER_NONE = 0;
public static final int BORDER_TOP = 1;
public static final int BORDER_RIGHT = 2;
public static final int BORDER_BOTTOM = 4;
public static final int BORDER_LEFT = 8;
public static final int BORDER_FULL = BORDER_TOP | BORDER_RIGHT | BORDER_BOTTOM | BORDER_LEFT;
@ColorInt private int color = Color.WHITE;
@ColorInt private int borderColor = Color.BLACK;
private int border = BORDER_FULL;
private int borderSize = 1;
private Paint paint;
public BackgroundDrawable() {
paint = new Paint();
paint.setAntiAlias(false); // no need for antialias since we are drawing only straight lines
}
private static void drawFill(Canvas canvas, int color, Paint paint) {
paint.setStyle(Paint.Style.FILL);
paint.setColor(color);
canvas.drawRect(canvas.getClipBounds(), paint);
}
private static void drawBorders(Canvas canvas, Paint paint, int border, int color, int borderSize) {
paint.setStyle(Paint.Style.STROKE);
paint.setColor(color);
paint.setStrokeWidth(borderSize);
if (border == BORDER_FULL) {
canvas.drawRect(canvas.getClipBounds(), paint);
return;
}
Rect clipBound = canvas.getClipBounds();
List<Float> points = new ArrayList<>();
if (hasBorder(border, BORDER_TOP)) {
points.add((float) clipBound.left);
points.add((float) clipBound.top);
points.add((float) clipBound.right);
points.add((float) clipBound.top);
}
if (hasBorder(border, BORDER_RIGHT)) {
points.add((float) clipBound.right);
points.add((float) clipBound.top);
points.add((float) clipBound.right);
points.add((float) clipBound.bottom);
}
if (hasBorder(border, BORDER_BOTTOM)) {
points.add((float) clipBound.right);
points.add((float) clipBound.bottom);
points.add((float) clipBound.left);
points.add((float) clipBound.bottom);
}
if (hasBorder(border, BORDER_RIGHT)) {
points.add((float) clipBound.right);
points.add((float) clipBound.bottom);
points.add((float) clipBound.right);
points.add((float) clipBound.top);
}
float lines[] = new float[points.size()];
for (int i = 0; i < lines.length; i++) {
lines[i] = points.get(i);
}
canvas.drawLines(lines, paint);
}
private static boolean hasBorder(int border, int which) {
return (border & which) != 0;
}
@Override
public void draw(@NonNull Canvas canvas) {
drawFill(canvas, color, paint);
drawBorders(canvas, paint, border, borderColor, borderSize);
}
@Override
public void setAlpha(@IntRange(from = 0, to = 255) int i) {
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
paint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.OPAQUE;
}
public int getColor() {
return color;
}
public void setColor(@ColorInt int color) {
this.color = color;
}
public int getBorderColor() {
return borderColor;
}
public void setBorderColor(@ColorInt int borderColor) {
this.borderColor = borderColor;
}
public void setBorder(int border) {
this.border = border;
}
public int getBorderSize() {
return borderSize;
}
public void setBorderSize(int borderSize) {
this.borderSize = borderSize;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment