TextView显示HTML文本时<IMG>标签指定图片的显示处理
TextView显示文本时是支持一些HTML标签的(具体支持那些标签会在下面附录列出),不会需要先用HTML的static方法fromHtml来转换一下。
Spanned text = Html.fromHtml(htmlString);
textView.setText(text);
这样,TextView就会把支持的一些HTML标签以HTML的形式显示出来。不过,如果htmlString中含有<img>标签,并需要在TextView中正确显示的话就必须做进一步的处理了。
Spanned text = Html.fromHtml(htmlString, imageGetter, null);
textView.setText(text);
通过Html的另一个重载的fromHtml方法,指定ImageGetter,来获取网络图片,异步加载的方式来显示图片。
下面给出ImageGetter的一个实现类,大部分代码来自网络,只针对关键部分做了完善,先看代码,后面详细说明。
public class URLImageGetter implements ImageGetter {
Context context;
TextView textView; public URLImageGetter(Context context, TextView textView) {
this.context = context;
this.textView = textView;
} @Override
public Drawable getDrawable(String paramString) {
final URLDrawable urlDrawable = new URLDrawable(context); ImageGetterAsyncTask getterTask = new ImageGetterAsyncTask(urlDrawable);
getterTask.execute(paramString);
return urlDrawable;
} public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable> {
URLDrawable urlDrawable; public ImageGetterAsyncTask(URLDrawable drawable) {
this.urlDrawable = drawable;
} @Override
protected void onPostExecute(Drawable result) {
if (result != null) {
urlDrawable.drawable = result; URLImageGetter.this.textView.requestLayout();
}
} @Override
protected Drawable doInBackground(String... params) {
String source = params[0];
return fetchDrawable(source);
} public Drawable fetchDrawable(String url) {
try {
InputStream is = fetch(url); Rect bounds = SystemInfoUtils.getDefaultImageBounds(context);
Bitmap bitmapOrg = BitmapFactory.decodeStream(is);
Bitmap bitmap = Bitmap.createScaledBitmap(bitmapOrg, bounds.right, bounds.bottom, true); BitmapDrawable drawable = new BitmapDrawable(bitmap);
drawable.setBounds(bounds); return drawable;
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return null;
} private InputStream fetch(String url) throws ClientProtocolException, IOException {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url); HttpResponse response = client.execute(request);
return response.getEntity().getContent();
}
} }
URLImageGetter
URLDrawable的实现类
public class URLDrawable extends BitmapDrawable {
protected Drawable drawable; public URLDrawable(Context context) {
this.setBounds(SystemInfoUtils.getDefaultImageBounds(context)); drawable = context.getResources().getDrawable(R.drawable.default_image_min);
drawable.setBounds(SystemInfoUtils.getDefaultImageBounds(context));
} @Override
public void draw(Canvas canvas) {
Log.d("test", "this=" + this.getBounds());
if (drawable != null) {
Log.d("test", "draw=" + drawable.getBounds());
drawable.draw(canvas);
}
} }
URLDrawable
在上述两个类中,有一点需要注意,那就是ImageGetter返回的Drawble对象的Bounds一定要设定。否则就会出现图片显示出来了,但和文字会出现重叠的现象。原因我想是TextView在针对spannable的html字符串中的<img>标签渲染的时候会根据ImageGetter得到的Drawable对象的Bounds来为图片预留出空间。所以,在URLDrawable的构造函数中设定了Bounds,其实就是设定图片宽度为屏幕宽度,高度按照16:9得到。在根据URL获取网络图片以后还需要根据预设的图片大小来缩放实际的图片,参见在URLImageGetter类中的fetchDrawable()函数。
当然在URLDrawable在构造中还增加了默认图片的显示,这一点对用户来讲很友好,对应用来讲也是一个凸显品牌和情怀的机会:)
getDefaultImageBounds()函数的代码如下:
public static Rect getDefaultImageBounds(Context context) {
Display display = ((Activity)context).getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = (int) (width * 9 / 16); Rect bounds = new Rect(0, 0, width, height);
return bounds;
}
getDefaultImageBounds
------------------------------------------------------------------------------------------------------------
附录:
HTML支持的标签
TextView显示HTML文本时<IMG>标签指定图片的显示处理的更多相关文章
- Jsoup提取文本时保留标签
使用Jsoup来对html进行处理比较方便,你可能会用它来提取文本或清理html标签.如果你想提取文本时保留标签,可以使用Jsoup.clean方法,参数为html及标签白名单: Jsoup.clea ...
- TextView展示富文本时emoj或图片和文字不对齐的解决方案
在项目中,回复框.聊天界面的显示往往会有emoj或者图片,但是一个比较头疼的问题是,会出现emoj表情或者图片和文字的位置不对齐,总是有偏移,这样很影响用户体验的.下面会总结一下如何解决这个问题. 本 ...
- HTML标签实现图片滚动显示
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- IE8下图片无法显示问题
一.背景图片不能显示的原因 代码: background:url(img/img1.jpg)no-repeat; background:url(img/img1.jpg) no-repeat; 第一个 ...
- PHP 读取文件夹(比如某共享文件夹)中的图片并显示
1.获取文件夹下图片public function albumList(){ $share_url = input('path'); $files = getImgList($share_url); ...
- css 图片 圆形显示区域
css 图片 圆形显示区域 css 和 div 实现 方形图片 圆形显示 点击下载
- 文本溢出显示省略号,CSS未加载时a标签仍可用处理方法
一.文本溢出打点 (1)单行文本 overflow: hidden; text-overflow:ellipsis; white-space: nowrap; (2)多行文本 overflow : h ...
- 我的Android进阶之旅------> Android为TextView组件中显示的文本添加背景色
通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...
- 我的Android进阶之旅------> Android为TextView组件中显示的文本加入背景色
通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...
随机推荐
- echarts4 主题切换
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 【mongodb】——常用命令大全
MongoDB是NoSQL数据库系统中比较流行的数据库之一.它也是最接近关系型数据库的,一个数据库可以包含多个集合(Collection),类似于关系数据库中的表:而每个集合中可以存储一组由列标识的记 ...
- 【BZOJ2300】【HAOI2011】防线修建
题目大意:给你m+3个点,有q个操作,每次要么询问当前点集构所构成的上凸壳总长度,要么在当前点集中删除一个点. 这题是吼题啊!!! 刚开始想着如何正常地做,考虑过用线段树维护一个区间内的凸包,发现并不 ...
- HTTP协议及WWW服务应用
一.用户访问网站的流程图 二.DNS解析的流程图 三.用户访问网站的基本流程原理阐述 ① 用户在浏览器中输入请求的地址回车 ② 先找本地的缓存和Hosts文件,有解析的对应IP直接返回个客户端IP地址 ...
- POJ 1270
#include<iostream> #include<algorithm> #define MAXN 26 #define MAX 300 using namespace s ...
- mysql中UNION ALL用法
MYSQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果. 举例说明: select * from table1 u ...
- 弹幕和回到顶部前端web
弹幕和回到顶部前端web 弹幕 1.效果演示 2.相关代码 <!DOCTYPE html> <html lang="en"> <head> &l ...
- 手淘的移动端适配方案flexible
基于 vue-cli 配置手淘的 lib-flexible + rem,实现移动端自适应 安装 flexible npm install lib-flexible --save 引入 flexible ...
- Android中实时预览UI和编写UI的各种技巧
一.啰嗦 之前有读者反馈说,你搞这个所谓的最佳实践,每篇文章最后就给了一个库,感觉不是很高大上.其实,我在写这个系列之初就有想过这个问题.我的目的是:给出最实用的库来帮助我们开发,并且尽可能地说明这个 ...
- 补间动画Tweened Animations
本例子简单讲一下怎么用补间动画 1.在xml中定义好动画的资源文件,如下(注意把不同的效果放在一起可以一起用,同时起效果) <?xml version="1.0" encod ...