Skip to content

Instantly share code, notes, and snippets.

@maoruibin
Last active July 11, 2019 11:52
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maoruibin/4293314f0b7c277c2a635efa858a3e6e to your computer and use it in GitHub Desktop.
Save maoruibin/4293314f0b7c277c2a635efa858a3e6e to your computer and use it in GitHub Desktop.
提供语义化 API 用来创建 Shape Drawable
**
* author : ruibin1 (ruibin1@staff.weibo.com)
* docs : https://github.com/maoruibin/maoruibin.github.com/issues/88
* build : 2019/3/21 - 3:55 PM.
*/
public class DrawableBuilder {
//默认线条粗细 1dp
private static final int defaultLineWidth = 1;
private static final int defaultLineColor = Color.parseColor("#e9e9e9");
private static final int defaultCornerRadius= 2;
//椭圆形圆角
private static final int defaultRoundCornerRadius= 100;
//默认虚线条单位长度 6dp
private static final int defaultDashWidth = 6;
//默认虚线条之间的间距 2dp
private static final int defaultDashGap = 2;
private int shape = RECTANGLE;
private int lineWidth = 0;
@ColorInt
private int lineColor = Color.TRANSPARENT;
private float cornerRadius = DeviceInfo.convertDpToPx(2);
/**
* 背景颜色,默认透明
*/
@ColorInt private int bkColor = Color.TRANSPARENT;
/**
* 虚线边框每个单元的长度
*/
private float dashWidth = 0;
/**
* 虚线边框每个单元之间的间距
*/
private float dashGap = 0;
public DrawableBuilder() {
}
public Drawable build() {
final GradientDrawable bg = new GradientDrawable();
bg.setShape(shape);
bg.setStroke(lineWidth,lineColor,dashWidth,dashGap);
bg.setCornerRadius(cornerRadius);
bg.setColor(bkColor);
return bg;
}
public DrawableBuilder shape(int shape) {
this.shape = shape;
return this;
}
/**
* 默认生成一个 1 dp 939393 的园线
* @return
*/
public DrawableBuilder line() {
return line(defaultLineWidth,defaultLineColor);
}
/**
* 构造线框
* @param width
* @param color
* @return
*/
public DrawableBuilder line(int width,int color) {
return lineWidth(width).lineColor(color);
}
public DrawableBuilder line(int width,String color) {
return lineWidth(width).lineColor(color);
}
/**
* 设置边框线条粗细 直接传入具体数值
*
* @return
*/
public DrawableBuilder lineWidth(int lineWidth) {
this.lineWidth = DeviceInfo.convertDpToPx(lineWidth);
return this;
}
public DrawableBuilder lineColor(int lineColor) {
this.lineColor = lineColor;
return this;
}
public DrawableBuilder lineColor(String lineColor) {
if (lineColor.charAt(0) != '#'){
throw new IllegalArgumentException("color value must be start with # like #000000");
}
return lineColor(Color.parseColor(lineColor));
}
/**
* 设置圆角度数,直接传入具体数值
* @param cornerRadius
* @return
*/
public DrawableBuilder corner(float cornerRadius) {
this.cornerRadius = DeviceInfo.convertDpToPx(cornerRadius);
return this;
}
/**
* 配置默认的圆角度数 为2
* @return
*/
public DrawableBuilder corner() {
return corner(defaultCornerRadius);
}
/**
* 大圆角
* @return
*/
public DrawableBuilder roundCorner() {
return corner(defaultRoundCornerRadius);
}
public DrawableBuilder fill(@ColorInt int bkColor) {
this.bkColor = bkColor;
return this;
}
public DrawableBuilder fill(String bkColor) {
if (bkColor.charAt(0) != '#'){
throw new IllegalArgumentException("color value must be start with # like #000000");
}
return fill(Color.parseColor(bkColor));
}
/**
* 生成一个默认的虚线 shape
* @return
*/
public DrawableBuilder dash() {
return dashWidth(defaultDashWidth).dashGap(defaultDashGap);
}
public DrawableBuilder dashWidth(float dashWidth) {
this.dashWidth = DeviceInfo.convertDpToPx(dashWidth);
return this;
}
public DrawableBuilder dashGap(float dashGap) {
this.dashGap = DeviceInfo.convertDpToPx(dashGap);
return this;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment