Created
September 14, 2017 12:45
-
-
Save staakk/d9bba54fa1e4d8951723856521b82278 to your computer and use it in GitHub Desktop.
[Android] Custom drawable for displaying solid color with border
This file contains hidden or 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
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