根据view布局动态生成带文字头像
现在很多软件在没设置头像的时候都会根据用户的名字生产一个头像展示,类似钉钉,下面就看看在安卓里面如何做到这样的效果吧。
可能下面方法不是最佳,但是思路应该没问题。
根据view生成Bitmap
要动态生成文字头像,最先想到的应该是使用layout布局吧。
每次用户名发生改变的时候通过布局修改文字,而要做到头像效果,接下来将布局变成 bitmap就可以去填充imageview了。
下面是一个将view转成bitmap的方法,用BitmapFactory.Options也可以(可能会更好一些)。
public static Bitmap getViewBitmap(View addViewContent, float scanX, float scanY) {
addViewContent.setDrawingCacheEnabled(true);
addViewContent.measure(
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
addViewContent.layout(0, 0,
addViewContent.getMeasuredWidth(),
addViewContent.getMeasuredHeight());
addViewContent.buildDrawingCache();
Bitmap bitmap = addViewContent.getDrawingCache();
int width = bitmap.getWidth();
int height = bitmap.getHeight();
//缩放矩阵
Matrix matrix = new Matrix();
matrix.postScale(scanX, scanY);
Bitmap newBitmap = Bitmap.createBitmap(bitmap,0,0,width,height,matrix,false);
if (!bitmap.isRecycled()) {
bitmap.recycle();
}
return newBitmap;
}
这里会有一个问题,直接给根布局设置背景图片会使布局失真,背景图片会以原大小显示,可以将背景图片放到imageview中去。
根据Bitmap生成Drawable
下面就是填充数据,并通过上面方法生成Drawable了。
private Drawable getDefaultIcon(String name) {
//添加默认头像
@SuppressLint("InflateParams")
View defaultIconView = LayoutInflater.from(getApplicationContext())
.inflate(R.layout.item_default_icon, null);
TextView text = defaultIconView.findViewById(R.id.text);
if (TextUtils.isEmpty(name)) {
text.setText("无");
}else {
text.setText(name.substring(0, 1));
}
Bitmap defaultIcon = ResourceUtil.getViewBitmap(defaultIconView, 1f, 1f);
return new BitmapDrawable(getResources(), defaultIcon);
}
使用Glide进行加载,生成默认头像
如何判断是否有设置好的头像呢?其实 glide 在这方面就很实用。
通过 Glide的RequestOptions可以设置很多东西,里面就可以设置我们定义的非正常头像,例如加载前、url为空、加载失败的图片。
//生成默认头像(忽略拼音变量,这是不好的习惯)
Drawable defaultIcon = getDefaultIcon(wgyData.get(i).getName());
//加载头像
ImageView imageView = markerView.findViewById(R.id.icon);
Glide.with(WgyMapActivity.this)
.load(wgyData.get(i).getPhotoUrl())
.apply(new RequestOptions()
.placeholder(defaultIcon) //加载前
.fallback(defaultIcon) //url为空
.error(defaultIcon) //加载失败
.transform(new CircleCrop()) //圆角
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.centerCrop()
)
.into(imageView);