maoruibin / maoruibin.github.com

personal blog
http://gudong.site
MIT License
21 stars 5 forks source link

通过语义化的 API 创建 Shape Drawable - DrawableBuilder #88

Open maoruibin opened 5 years ago

maoruibin commented 5 years ago
**
 * 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;
    }
}