通常情況下TextView隻用來顯示文本資料,但是TextView也可以顯示圖檔,如果結合Html則可以顯示非常複雜的圖文混排效果。
1、 使用諸如屬性android:drawableTop=""等來讓TextView顯示圖檔
2、 結合Html來顯示圖檔。(重點介紹)
在TextView中預訂了一些類似HTML的标簽,通過标簽可以使TextView控件顯示不同顔色,大小,字型的文字
<font>:設定顔色和字型
<big>:設定大号
<small>:設定小号
<i>\<b>:斜體、粗體
<a>:連結位址
<img>:插入圖檔
等等。
如何使用:
1、比如如何讓TextView可以識别這麼一段Html文字 <font color=”red”>紅色字型</font>
這個時候需要用到一個類:Html。 使用它的一個靜态方法:
Spanned spanned =Html.fromHtml("<font color=’red’>紅色</font>");
傳回的Spanned類型的對象,Spanned是個接口繼承了CharSequence接口。是以直接把Spanned對象通過setText方法直接讓TextView顯示即可。
2、如果Html資料中有img圖檔怎麼辦?則直接使用上面的方法無法顯示圖檔。
例如:String html ="<font color='red'>紅色字型</font> <h1>h1标題</h1>" +
"</br>" +
"下面是圖檔<br />"
+ "<imgsrc='http://pic6.nipic.com/20100308/4080141_175940029491_2.jpg' />"
+ "<imgsrc='http://pic6.nipic.com/20100308/4080141_175940029491_2.jpg' />";
則需要調用Html的這個靜态方法:
Html.fromHtml(String source, ImageGetter imageGetter,TagHandler tagHandler)
其中:source就是字元串形式的Html代碼,ImageGetter就是圖檔的資源, TagHandler指的處理一些未知标簽,一般情況置為null就可以了。
重點是ImageGetter:它是一個接口,隻有一個方法:
public Drawable getDrawable(String source),隻要覆寫這個方法就可以了。其中參數為html資料中img标簽的src屬性的值(url或者本地圖檔的位址都可以)。
注意:由于通路網絡的代碼必須放在子線程,是以涉及到網絡圖檔展示的時候,需要把這行代碼放在子線程中執行,這樣getDrawable方法就會在子線程中執行。
另外:即使src屬性沒有任何值,隻要getDrawable有傳回值,就會顯示相應的圖檔。
ImageGetter的實作:
class MyImageGetter implements Html.ImageGetter{
@Override
public Drawable getDrawable(String source){
Drawable drawable = null;
try{
URL ulr = new URL(source);
InputStream inputStream = ulr.openStream();
drawable = Drawable.createFromStream(inputStream, "");
}catch(Exception e){
e.printStackTrace();
}
if(drawable != null){
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable
.getIntrinsicHeight());
}
return drawable;
}
}
子線程:
final String html = "<font color='red'>紅色字型</font> <h1>h1标題</h1>" +
"<br />" +
"下面是圖檔<br />"
+ "<img src='http://pic6.nipic.com/20100308/4080141_175940029491_2.jpg' />"
+"<img src='http://pic6.nipic.com/20100312/4080141_202844009651_2.jpg ' />";
new Thread(){
@Override
public void run(){
final Spanned spanned = Html.fromHtml(html, new MyImageGetter(), null);
textView.post(new Runnable(){
@Override
public void run(){
textView.setText(spanned);
}
});
}
}.start();
效果圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TNxATMzEDN3EjNxIDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)