1、问题来源
TextView 是我们经常用到的控件,有时候我们也会用 TextView 来显示内容和图片,但是 TextView 只能接收一个 Drawable,但是我们实际的开发过程中更多的时候是一个图片 URL 地址,然后加载显示。但是我接下来要实现的一个效果如下:
看到效果图,我的第一反应自然是用 TextView 来实现。但在实现的过程中,发现由于图片的大小不一致,而 TextView又不能单独设置显示的图片的大小,因此 会导致图片的显示乱七八糟,这显然不是我们所期望的,于是就想着能不能有一种办法让它显示我们需要的大小,因为我的项目使用的网络加载框架是 Glide,因此此解决方案主要就是针对使用 Glide 来处理。
熟悉 Glide 的都知道 Glide 在进行图片的加载的时候,允许我们在拿到数据的时候做一些自己的预处理,在这里我们需要用到 SimpleTarget ,通过他的
onResourceReady(Bitmap resource, GlideAnimation super Bitmap> glideAnimation) 来对需要显示的资源进行处理,具体代码已封装如下:
/**
* 设置 TextView 的图片
* @param context 当前上下文
* @param actX 实际宽
* @param actY 实际高
* @param url 图片地址
* @param isRight 是否右边显示
* @param textView 要设置的 TextView 控件
* @param text 文本内容
*/
public static void setPicture(Context context,
final int actX,
final int actY,
String url,
final boolean isRight,
final TextView textView,
final String text) {
final ConvertDrawable convertDrawable = new ConvertDrawable();
Glide.with(context).load(url)
.asBitmap()
.placeholder(R.drawable.team_default_logo)
.error(R.drawable.team_default_logo)
.into(new SimpleTarget(){
@Override
public void onResourceReady(Bitmap resource, GlideAnimation super Bitmap> glideAnimation) {
int x = resource.getWidth();
int y = resource.getHeight();
if (x > actX || y > actY) {
//进行等比例缩放程序
Matrix matrix = new Matrix();
matrix.postScale((float) (actX * 1.00 / x), (float) (actX * 1.00 / x));
//长和宽放大缩小的比例
resource = Bitmap.createBitmap(resource, 0, 0, x, y, matrix, true);
}
convertDrawable.bitmap = resource;
convertDrawable.setBounds(0, 0, resource.getWidth(), resource.getHeight());
if (isRight) {
textView.setCompoundDrawables(null,null, convertDrawable,null);
} else {
textView.setCompoundDrawables(convertDrawable,null,null,null);
}
textView.invalidate();
}
});
textView.setText(text);
}
复制代码
下面是将将 Bitmap 转换为 Drawable 图片的实现类。
private static class ConvertDrawable extends BitmapDrawable {
protected Bitmap bitmap;
@Override
public void draw(Canvas canvas) {
if (bitmap != null) {
canvas.drawBitmap(bitmap, 0, 0, getPaint());
}
}
}
复制代码
好了,有了上面的处理,就能很轻松的实现图中所示的效果了。