开发中,向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.设置文字
- ((TextView) findViewById(R.id.tv_gradlist_calorie_desc)).setText(Html
- .fromHtml(descString(), getImageGetterInstance(), null));
- /**
- * 字符串
- *
- * @return
- */
- private String descString() {
- return "您消耗的总热量约等于4杯" + "<img src='" + R.drawable.ic_gradlist_coke
- + "'/>" + "+5只" + "<img src='" + R.drawable.ic_gradlist_ice
- + "'/>" + "+10个" + "<img src='"
- + R.drawable.ic_gradlist_hamburger + "'/>" + "";
- }
- /**
- * ImageGetter用于text图文混排
- *
- * @return
- */
- public ImageGetter getImageGetterInstance() {
- ImageGetter imgGetter = new Html.ImageGetter() {
- @Override
- public Drawable getDrawable(String source) {
- int fontH = (int) (getResources().getDimension(
- R.dimen.textSizeMedium) * 1.5);
- int id = Integer.parseInt(source);
- Drawable d = getResources().getDrawable(id);
- int height = fontH;
- int width = (int) ((float) d.getIntrinsicWidth() / (float) d
- .getIntrinsicHeight()) * fontH;
- if (width == 0) {
- width = d.getIntrinsicWidth();
- }
- d.setBounds(0, 0, width, height);
- return d;
- }
- };
- return imgGetter;
- }