X

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

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

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



本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/用字符串生成图片(头像-)用处多多/
Categories: Android
admin: