用字符串生成图片(头像...)
在我们平时做项目的时候,经常会遇到一些需要显示图片的地方,这些图片默认的占位图,怎么显示才比较合理呢,比如头像,默认图片 可以是名字生成的图片这样比千篇一律的默认图,显示效果更佳。下边是效果图:
直接上代码:先说用法
/** * 根据文字生成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); }}
用字符串生成图片(头像...)相关推荐
- 【原创】生成文件MD5图像,类似于GitHub的像素风格头像
前言 我想通过文件的md5生成关于这个md5的图像,类似于GitHub的随机像素头像,用处是让这个md5更加直观,也能用于生成各种用户头像,跟GitHub一样. 网上搜了一下,没有现成的方法,只能有一 ...
- php获取头像,WordPress中用于获取及自定义头像图片的PHP脚本详解
get_avatar()(获取头像)get_avatar() 函数用来获取置顶邮箱或者用户的头像代码,在评论列表中非常常用. 这个函数提供一个 get_avatar 过滤器,用来过滤头像的 Html ...
- java网络图片与二进制字符串相互转换
/** * @Title getImgeHexString * @Description 网络图片转换成二进制字符串 * @param URLName 网络图片地址 * ...
- 二进制数据流方式实现 个人头像的读取、上传、修改------善良公社项目
这几天自己在实现个人资料修改信息这块,首先当用户注册后并不能来的把所有详细信息都填写完整,所有这块需要用户通过修改用户上传自己的头像,首先系统会默认加载一个头像,如图: 现在系统是默认的,我点击修改资 ...
- php 自动获取头像,PHP_WordPress中用于获取及自定义头像图片的PHP脚本详解,get_avatar()(获取头像)
get_avat - phpStudy...
WordPress中用于获取及自定义头像图片的PHP脚本详解 get_avatar()(获取头像)get_avatar() 函数用来获取置顶邮箱或者用户的头像代码,在评论列表中非常常用. 这个函数提供 ...
- PHP批量生成底部带编号二维码(二维码生成+文字生成图片+图片拼接合并)
PHP批量生成带底部编号二维码(二维码生成+文字生成图片+图片拼接合并) 需求: 输入编号如 : cb05-0000001 至 cb05-0000500 批量生成 以编号为名称的下图二维码,然后压缩 ...
- Ketcher基本使用和用SMILES字符串生成键线式矢量图
Ketcher基本使用和用SMILES字符串生成键线式矢量图 Ketcher介绍 Ketcher 是一个基于 Web 的开源化学结构编辑器.Ketcher 专为绘制结构和反应的化学家.实验室科学家和技 ...
- 项目集成腾讯移动直播总结--后端
最近项目新增直播带货需求,指定使用腾讯移动直播SDK,集成的过程也算是磕磕绊绊,因为以前自己没接触过,同事也没做过这一块,所以很多不清不楚的地方,而且是是多端集成,主播端在App直播,用户端是在小程序 ...
- Android利用zxing生成二维码
感谢大佬:https://blog.csdn.net/mountain_hua/article/details/80646089 **gayhub上的zxing可用于生成二维码,识别二维码 gayhu ...
最新文章
- Balanced Binary Tree leetcode java
- mxnet基础到提高(5)-- 卷积神经网络基础(1)
- java servlet上传centos服务器
- BZOJ1058 ZJOI2007 报表统计 线段树+平衡树
- Jboss AS7 的一些配置备忘
- linux 查看进程
- 内网穿透 无需公网ip_无需端口映射、无需公网IP,60秒实现FTP服务远程访问
- 清洁代码_清洁单元测试
- mysql数字前面有0_Mysql中前边有0的数据,0会被舍去的问题
- Java 进栈出栈的过程
- 关于MySQL优化的几个问题
- UE3 性能、分析及优化
- 【ElasticSearch】es ResourceWatcherService 的 初始化 启动 源码解析
- arm开发板嵌入式 linux 修改开机启动logo,ARM开发板 嵌入式Linux 修改开机启动LOGO...
- 最受开发人员欢迎的JDBC接口
- php按钮打开文件选择框,在Select file(选择)页面单击Select file(选择文件)按钮
- 模糊综合评价模型 ——第四部分,多级模糊综合评价模型应用:例题4,根据学生表现评选奖学金
- 华为网络设备交换机路由器查看日志命令方法
- 《深度学习:21 天实战 Caffe》资源已上传至码云、github
- Facebook登陆时遇到的问题