android textview 加载html 显示图片
2017-12-11 本文已影响24人
S晔枫
需求: TextView中显示html 还要展示上面的图片, 文字还好解决 直接调用
// html要显示的文字
textView.setText(Html.fromHtml(html));
坑的是里面还要显示图片, 而且还不确定图片的位置, 折腾了大半天, 在网上找到一个比较比较靠谱的方法, 特此记录 :
@Deprecated
// 用到的方法 从提供的HTML字符串中返回可显示样式的文本,并使用遗留标记
public static Spanned fromHtml(String source, ImageGetter imageGetter,TagHandler tagHandler) {
return fromHtml(source, FROM_HTML_MODE_LEGACY, imageGetter, tagHandler);
}
好了 直接上代码 (ps: 可拿去直接用)
自定义ImageGetter类
public class MyImageGetter implements Html.ImageGetter {
private Context context;
String data;// 要加载的html内容
TextView tv;// 加载html内容的TextView控件
public MyImageGetter (Context context, TextView tv,
String data) {
this.context = context;
this.tv = tv;
this.data = data;
}
@Override
// 主要是重写此方法
public Drawable getDrawable(String source) {
Drawable drawable = null;
if (source != null && source.length() > 0) {
// 截取图片名称 可根据自己的实际情况选择
String imgName = source.substring(33, source.length());
// 图片地址 我这因为后台返回的是相对地址 需要我自己拼接
final String imgUrl= NetWork.BASE_URL + source.substring(2, source.length());
File file = new File(Environment.getExternalStorageDirectory(), imgName);
if (file.exists()) {
drawable = Drawable.createFromPath(file.getAbsolutePath());
if (drawable != null) {
drawable.setBounds(0, 0, drawable.getIntrinsicWidth() * 2, drawable.getIntrinsicHeight() * 2);
}
} else {
VolleyUtils.getNetworkImg(context, imgUrl, imgName, tv, data, this);
}
}
return drawable;
}
}
下载图片 VolleyUtils 类
public class VolleyUtils {
/**
* 通过volley请求网络图片
* @param url
*/
public static void getNetworkImg(Context context, String url, final String name, final TextView tv,
final String data, final NetWorkImageGetter mNetWorkImageGetter) {
RequestQueue queue = Volley.newRequestQueue(context);
ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
saveMyBitmap(name, bitmap);
tv.setText(Html.fromHtml(data, mNetWorkImageGetter, null));
}
}, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
queue.add(request);
}
/**
* 保存获取到的网络图片到sdcard
* @param bitName
* @param mBitmap
*/
public static void saveMyBitmap(String bitName, Bitmap mBitmap) {
File f = new File("/sdcard/" + bitName);
try {
f.createNewFile();
} catch (IOException e) {
}
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用 实例:
MyImageGetter imageGetter = new MyImageGetter (this,
textView, html);
textView.setText(Html.fromHtml(html, imageGetter, null));
整个逻辑 : 先判断本地是否存在对应的图片-->有 直接显示 -->没有从网上下载并保存到本地 .