Android TextView Html加载图片Glide
最近有个项目要使用很多次富文本加载的内容,因为不确定用户会输入什么富文本,提议的方案有2个,一个是WebView加载,还有一个方案是使用原生。WebView加载就不介绍了,使用原生,刚开始我是想自己解析富文本内容的,但是不确定因数太多,看看也要一定时间,最后采用了TextView加载富文本。
先上效果图:
图片地址:https://img.alicdn.com/imgextra/i3/2454452051/TB2DH1acYFkpuFjy1XcXXclapXa_!!2454452051.jpg
下面上代码:
String htmlText = introduction;
tvContent.setText(Html.fromHtml(htmlText, new URLImageParser(XXX.this, tvContent), null));
//tvContent.setMovementMethod(ScrollingMovementMethod.getInstance());// 设置可滚动
看了很多资料,有一个图片加载方式是这样子的
ImageGetter imgGetter = new Html.ImageGetter() {
public Drawable getDrawable(String source) {
Log.i("RG", "source---?>>>" + source);
Drawable drawable = null;
URL url;
try {
url = new URL(source);
Log.i("RG", "url---?>>>" + url);
drawable = Drawable.createFromStream(url.openStream(), ""); // 获取网路图片
} catch (Exception e) {
e.printStackTrace();
return null;
}
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
Log.i("RG", "url---?>>>" + url);
return drawable;
}
};
这个方式当时验证的时候有点问题。
后来看了篇http://blog.csdn.net/dyllove98/article/details/9174261这篇博客看见了异步获取图片。好,开始动手,
由于自己框架使用的是Glide方式,所以就是一个glide异步获取图片的方式。下面上代码:
public class URLImageParser implements Html.ImageGetter {
private Context context;
private TextView tvContent;
private int actX;//实际的宽 放大缩小基于textview的宽度
private int actY;
public URLImageParser(Context context, TextView tvContent) {
this.context = context;
this.tvContent = tvContent;
//获取全屏大小
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
//我的textview有左右留边 margin
actX = metrics.widthPixels - DensityUtil.dp2px(MainApplication.getContext(), 40);
actY = metrics.heightPixels;
}
@Override
public Drawable getDrawable(String source) {
final URLDrawable urlDrawable = new URLDrawable();
Glide.with(context)
.load(source)
.asBitmap()
//.placeholder(R.drawable.default_duan)
//.error(R.drawable.default_duan)
//这里一定要这样,要拿到图片的实际高度,有没有Glide其他的加载方法就不说了,懒人直接拿来用就好了
.into(new SimpleTarget<Bitmap>() {
@Override
public void onStart() {
}
@Override
public void onStop() {
}
@Override
public void onDestroy() {
}
@Override
public void onLoadStarted(Drawable placeholder) {
}
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable) {
//加载失败就不管
}
@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);
}
urlDrawable.bitmap = resource;
urlDrawable.setBounds(0, 0, resource.getWidth(), resource.getHeight());
tvContent.invalidate();
tvContent.setText(tvContent.getText()); // 解决图文重叠
}
@Override
public void onLoadCleared(Drawable placeholder) {
}
@Override
public void setRequest(Request request) {
}
@Override
public Request getRequest() {
return null;
}
});
return urlDrawable;
}
public class URLDrawable extends BitmapDrawable {
protected Bitmap bitmap;
@Override
public void draw(Canvas canvas) {
if (bitmap != null) {
canvas.drawBitmap(bitmap, 0, 0, getPaint());
}
}
}
}
这里一定要注意onResourceReady()方法里是基于图片缩放的得到的新的图片拿来设置的,开始的时候一直是urlDrawable.setBounds(0, 0, actX, (int)(x / actX * y));拿到的图片一直显示不全,总是少了一部分,试了N多方法,后来想起是不是图片的大小没变,果然拿来之后缩放了图片,OK了。至于其他图片的异步加载框架就不说了,重复onResourceReady()里方法。