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>标签指定图片的显示处理的更多相关文章

  1. Jsoup提取文本时保留标签

    使用Jsoup来对html进行处理比较方便,你可能会用它来提取文本或清理html标签.如果你想提取文本时保留标签,可以使用Jsoup.clean方法,参数为html及标签白名单: Jsoup.clea ...

  2. TextView展示富文本时emoj或图片和文字不对齐的解决方案

    在项目中,回复框.聊天界面的显示往往会有emoj或者图片,但是一个比较头疼的问题是,会出现emoj表情或者图片和文字的位置不对齐,总是有偏移,这样很影响用户体验的.下面会总结一下如何解决这个问题. 本 ...

  3. HTML标签实现图片滚动显示

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  4. IE8下图片无法显示问题

    一.背景图片不能显示的原因 代码: background:url(img/img1.jpg)no-repeat; background:url(img/img1.jpg) no-repeat; 第一个 ...

  5. PHP 读取文件夹(比如某共享文件夹)中的图片并显示

    1.获取文件夹下图片public function albumList(){ $share_url = input('path'); $files = getImgList($share_url); ...

  6. css 图片 圆形显示区域

    css 图片 圆形显示区域 css 和 div 实现 方形图片 圆形显示 点击下载

  7. 文本溢出显示省略号,CSS未加载时a标签仍可用处理方法

    一.文本溢出打点 (1)单行文本 overflow: hidden; text-overflow:ellipsis; white-space: nowrap; (2)多行文本 overflow : h ...

  8. 我的Android进阶之旅------> Android为TextView组件中显示的文本添加背景色

    通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...

  9. 我的Android进阶之旅------&gt; Android为TextView组件中显示的文本加入背景色

    通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...

随机推荐

  1. 盘点Xcode中开发者最喜爱的十大开源插件

    Xcode IDE拥有着诸如导航.重构.校准等众多非常高大上的工具,而予以辅助的插件更是在Xcode的基础上对相关功能进行改进与扩展.在应用开发过程中,通过开源包管理器Alcatraz对插件进行安装管 ...

  2. Python(网络基础)

    day33 参考:http://www.cnblogs.com/linhaifeng/articles/5937962.html IP协议: 规定网络地址的协议叫ip协议,它定义的地址称之为ip地址, ...

  3. Python面向对象(类的成员之字段)

    day24 类的成员之字段 # 字段         - 普通字段,保存在对象中,执行只能通过对象访问         - 静态字段,保存在类中,  执行 可以通过对象访问 也可以通过类访问 clas ...

  4. Tcp下载文件

    一.下载文件 tcp 客户端 1.创建套接字down_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)2.获取ip,portdown ...

  5. day 35 dom 编程 补充

    前情提要: dom 编程 我记得写过dom 编程的记录..找了博客发现没有内容了.. 少侠重新来过吧

  6. D07——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D07 20180826内容纲要: 面向对象进阶学习 1 静态方法 2 类方法 3 属性方法 4 类的特殊成员方法(本节重点) 5 反射(本节重点) 6 异常(本 ...

  7. POJ 2350

    #include<iostream> #include<stdio.h> #include<iomanip> using namespace std; int ma ...

  8. 【PaddlePaddle系列】手写数字识别

      最近百度为了推广自家编写对深度学习框架PaddlePaddle不断推出各种比赛.百度声称PaddlePaddle是一个“易学.易用”的开源深度学习框架,然而网上的资料少之又少.虽然百度很用心地提供 ...

  9. linux下mysql主从复制搭建

    目标:搭建两台MySQL服务器,一台作为主服务器,一台作为从服务器,实现主从复制 环境: 主数据库: 192.168.1.1 从数据库: 192.168.1.2 mysql安装可参考:https:// ...

  10. linux 手动释放buff/cache

    为了解决buff/cache占用过多的问题执行以下命令即可 syncecho 1 > /proc/sys/vm/drop_cachesecho 2 > /proc/sys/vm/drop_ ...