在我们平时做项目的时候,经常会遇到一些需要显示图片的地方,这些图片默认的占位图,怎么显示才比较合理呢,比如头像,默认图片 可以是名字生成的图片这样比千篇一律的默认图,显示效果更佳。下边是效果图:

直接上代码:先说用法
/** * 根据文字生成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);    }}

用字符串生成图片(头像...)相关推荐

  1. 【原创】生成文件MD5图像,类似于GitHub的像素风格头像

    前言 我想通过文件的md5生成关于这个md5的图像,类似于GitHub的随机像素头像,用处是让这个md5更加直观,也能用于生成各种用户头像,跟GitHub一样. 网上搜了一下,没有现成的方法,只能有一 ...

  2. php获取头像,WordPress中用于获取及自定义头像图片的PHP脚本详解

    get_avatar()(获取头像)get_avatar() 函数用来获取置顶邮箱或者用户的头像代码,在评论列表中非常常用. 这个函数提供一个 get_avatar 过滤器,用来过滤头像的 Html ...

  3. java网络图片与二进制字符串相互转换

    /** * @Title           getImgeHexString * @Description     网络图片转换成二进制字符串 * @param URLName   网络图片地址 * ...

  4. 二进制数据流方式实现 个人头像的读取、上传、修改------善良公社项目

    这几天自己在实现个人资料修改信息这块,首先当用户注册后并不能来的把所有详细信息都填写完整,所有这块需要用户通过修改用户上传自己的头像,首先系统会默认加载一个头像,如图: 现在系统是默认的,我点击修改资 ...

  5. php 自动获取头像,PHP_WordPress中用于获取及自定义头像图片的PHP脚本详解,get_avatar()(获取头像) get_avat - phpStudy...

    WordPress中用于获取及自定义头像图片的PHP脚本详解 get_avatar()(获取头像)get_avatar() 函数用来获取置顶邮箱或者用户的头像代码,在评论列表中非常常用. 这个函数提供 ...

  6. PHP批量生成底部带编号二维码(二维码生成+文字生成图片+图片拼接合并)

    PHP批量生成带底部编号二维码(二维码生成+文字生成图片+图片拼接合并) 需求: 输入编号如 : cb05-0000001  至 cb05-0000500 批量生成 以编号为名称的下图二维码,然后压缩 ...

  7. Ketcher基本使用和用SMILES字符串生成键线式矢量图

    Ketcher基本使用和用SMILES字符串生成键线式矢量图 Ketcher介绍 Ketcher 是一个基于 Web 的开源化学结构编辑器.Ketcher 专为绘制结构和反应的化学家.实验室科学家和技 ...

  8. 项目集成腾讯移动直播总结--后端

    最近项目新增直播带货需求,指定使用腾讯移动直播SDK,集成的过程也算是磕磕绊绊,因为以前自己没接触过,同事也没做过这一块,所以很多不清不楚的地方,而且是是多端集成,主播端在App直播,用户端是在小程序 ...

  9. Android利用zxing生成二维码

    感谢大佬:https://blog.csdn.net/mountain_hua/article/details/80646089 **gayhub上的zxing可用于生成二维码,识别二维码 gayhu ...

最新文章

  1. Balanced Binary Tree leetcode java
  2. mxnet基础到提高(5)-- 卷积神经网络基础(1)
  3. java servlet上传centos服务器
  4. BZOJ1058 ZJOI2007 报表统计 线段树+平衡树
  5. Jboss AS7 的一些配置备忘
  6. linux 查看进程
  7. 内网穿透 无需公网ip_无需端口映射、无需公网IP,60秒实现FTP服务远程访问
  8. 清洁代码_清洁单元测试
  9. mysql数字前面有0_Mysql中前边有0的数据,0会被舍去的问题
  10. Java 进栈出栈的过程
  11. 关于MySQL优化的几个问题
  12. UE3 性能、分析及优化
  13. 【ElasticSearch】es ResourceWatcherService 的 初始化 启动 源码解析
  14. arm开发板嵌入式 linux 修改开机启动logo,ARM开发板 嵌入式Linux 修改开机启动LOGO...
  15. 最受开发人员欢迎的JDBC接口
  16. php按钮打开文件选择框,在Select file(选择)页面单击Select file(选择文件)按钮
  17. 模糊综合评价模型 ——第四部分,多级模糊综合评价模型应用:例题4,根据学生表现评选奖学金
  18. 华为网络设备交换机路由器查看日志命令方法
  19. 《深度学习:21 天实战 Caffe》资源已上传至码云、github
  20. Facebook登陆时遇到的问题

热门文章

  1. Linux ag命令常用参数
  2. 机器爱人即将一统江湖,谁还稀罕过什么情人节
  3. python海报_Python下载爱奇艺首页海报
  4. Excel中16进制递增、公式后加符号显示的方法
  5. 浅谈敏捷思想-07.AARRR模型
  6. Android 判断手机厂商rom
  7. 如何使一台电脑用网线连接到另一台电脑上上网
  8. Vivado生成bitstream被挂起在 running multiple block runs
  9. 牧牛区块链商学院,区块链构建价值载体
  10. 【自制数据集自动标注】yolo目标检测 voc格式 单调无遮挡背景单个物体自制数据集自动标注