用字符串生成图片(头像...)用处多多

1,141 阅读6分钟
原文链接: mp.weixin.qq.com
在我们平时做项目的时候,经常会遇到一些需要显示图片的地方,这些图片默认的占位图,怎么显示才比较合理呢,比如头像,默认图片 可以是名字生成的图片这样比千篇一律的默认图,显示效果更佳。下边是效果图:

直接上代码:先说用法
/** * 根据文字生成drawable * @param name 显示在图片的名字 * @param fontRes  字体大小 * @param width 图片的宽度 * @param height 图片的高度 * @return  */
public static TextDrawable getDefaultDrawable(String name, int fontRes, int width, int height) {    String username = name;    if ((name != null && name.length() >= 2)) {        username = name.substring(name.length() - 2, name.length());    } else if (BackwardSupportUtil.isNullOrNil(name)) {        username = "";    }    return TextDrawable.builder()            .beginConfig()            .fontSize(fontRes)            .width(width)            .height(height)            .endConfig()            .buildRound(username, getColorBySeed(BackwardSupportUtil.nullAsNil(username)));}
说明:主要看一下下边代码的思路,学习东西要先学会它的主要实现思路,理解原理。首先它是继承了ShapeDrawable ,通过build方法构造出自己想要的图片的属性,然后再用paint绘制出图形。下边是主要代码
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 {        IConfigBuilder width(int width);        IConfigBuilder height(int height);        IConfigBuilder textColor(int color);        IConfigBuilder withBorder(int thickness);        IConfigBuilder useFont(Typeface font);        IConfigBuilder fontSize(int size);        IConfigBuilder bold();        IConfigBuilder toUpperCase();        IShapeBuilder endConfig();    }    public interface IBuilder {        TextDrawable build(String text, int color);    }    public interface IShapeBuilder {        IConfigBuilder beginConfig();        IBuilder rect();        IBuilder round();        IBuilder roundRect(int radius);        TextDrawable buildRect(String text, int color);        TextDrawable buildRoundRect(String text, int color, int radius);        TextDrawable buildRound(String text, int color);    }}