Android TextView图文混排效果

开发中,向TextView或EditText中添加图像只比直接添加文本复杂一点点,需要用到<img>标签。

         <img>只有一个src属性,该属性原则上应该指向一个图像地址或可以找到某个图像资源的唯一标识。但要注意的是,系统并不会直接根据src属性所指的值自动获取和显示图像,这一切都需要我们去做。说白了,src属性指的是什么只有开发者自己知道。开发者需要告诉系统src属性到底指的是什么,然后系统才会知道怎么做。

    解析src属性值需要ImageGetter对象的getDrawable方法来完成。ImageGetter是一个接口。使用Html.fromHtml会使这一过程变得简单。

public static Spanned fromHtml(String source,ImageGetter imageGetter, TagHandler tagHandler);

formHtml方法有如下3个参数:

source:包含html标签的字符串。

imageGetter:ImageGetter对象。当系统解析到<img>标签时就会调用ImageGetter对象的getDrawable方法,并将src属性值传入getDrawable方法。至于src属性值得具体含义,就要在getDrawable方法中确定了。getDrawable方法返回一个Drawable对象。我们可以从res/drawable资源、SD卡或网络获得图片资源,并封装成Drawable对象。

tagHandler:TagHandler对象。这个参数使用的并不多。当系统处理每一个标签时都会调用该对象的handleTag方法。如果不使用该参数,可将它设为null。

在getDrawable方法中使用获得图像资源的Drawable对象后,必须使用Drawable.setBounds方法设置图像的显示区域,否则显示区域的面积为0,也就不会在TextView中显示图像了。通过SetBounds方法还可以将原图像放大或缩小显示。


Android TextView中有图片有文字混合排列,步骤:

1.使用html.fromHtml

2.新建ImageGetter

3.使用<img src>标签


demo:

1.设置文字

[java]  view plain copy
  1. ((TextView) findViewById(R.id.tv_gradlist_calorie_desc)).setText(Html  
  2.            .fromHtml(descString(), getImageGetterInstance(), null));  
2.获取文字

[java]  view plain copy
  1. /** 
  2.  * 字符串 
  3.  *  
  4.  * @return 
  5.  */  
  6. private String descString() {  
  7.     return "您消耗的总热量约等于4杯" + "<img src='" + R.drawable.ic_gradlist_coke  
  8.             + "'/>" + "+5只" + "<img src='" + R.drawable.ic_gradlist_ice  
  9.             + "'/>" + "+10个" + "<img src='"  
  10.             + R.drawable.ic_gradlist_hamburger + "'/>" + "";  
  11.   
  12. }  
3.imagegetter

[java]  view plain copy
  1. /** 
  2.  * ImageGetter用于text图文混排 
  3.  *  
  4.  * @return 
  5.  */  
  6. public ImageGetter getImageGetterInstance() {  
  7.     ImageGetter imgGetter = new Html.ImageGetter() {  
  8.         @Override  
  9.         public Drawable getDrawable(String source) {  
  10.             int fontH = (int) (getResources().getDimension(  
  11.                     R.dimen.textSizeMedium) * 1.5);  
  12.             int id = Integer.parseInt(source);  
  13.             Drawable d = getResources().getDrawable(id);  
  14.             int height = fontH;  
  15.             int width = (int) ((float) d.getIntrinsicWidth() / (float) d  
  16.                     .getIntrinsicHeight()) * fontH;  
  17.             if (width == 0) {  
  18.                 width = d.getIntrinsicWidth();  
  19.             }  
  20.             d.setBounds(00, width, height);  
  21.             return d;  
  22.         }  
  23.     };  
  24.     return imgGetter;  
  25. }  
最终效果:
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值