前沿:
項目中往往需要顯示一段文本,如果對文本需要特定的效果,就要寫自訂的span,這樣的工作量會變得很大,目前android支援html格式的文本,下面就是我對android支援html的程度和使用方式的總結。
Android支援html 的兩個介面
1 Spanned android.text.Html.fromHtml(String source)
輸入的參數為(html格式的文本)
目前android不支援全部的html的標籤,目前只支援與文本顯示和段落等標籤,對於圖片和其他的多媒體,還有一些自訂標籤不能識別
2 Spanned android.text.Html.fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler)Source: 需處理的html文本
imageGetter :對圖片處理(處理html中的圖片標籤)
tagHandler :對標籤進行處理(相當於自訂的標籤處理,在這裡面可以處理自訂的標籤)
在第二個介面中,在實際應用中,需要處理html中的img為網狀圖片,同時也需要處理一些自訂的標籤 如【視頻】,下面我就說明這兩塊的概要實現
【1】 實現ImageGetter擷取網狀圖片
ImageGetter imgGetter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Drawable d=null;
try
{
URL aryURI = new URL(source);
/* 開啟串連 */
URLConnection conn = aryURI.openConnection();
conn.connect();
/* 轉變為 InputStream */
InputStream is = conn.getInputStream();
/* 將InputStream轉變為Bitmap */
//Bitmap bm = BitmapFactory.decodeStream(is);
/* 關閉InputStream */
/*添加圖片*/
d=Drawable.createFromStream(is, "111");
is.close();
} catch (IOException e)
{
e.printStackTrace();
}
d.setBounds(1, 1, 45, 45);
return d;
}
以上代碼已經實際檢驗過,請放心copy
註:public Drawable getDrawable(String source)
中Source 代表 <img> 標籤中的圖片路徑
【2】 實現 自訂的TagHandler
實現的概要說明:
Step one 繼承 TagHandler介面
Step Two 實現
public void handleTag(boolean opening, String tag, Editable output,
XMLReader xmlReader)
介面被調用的過程:
系統在解析html文本
發現tag時調用一次 如<html>
介面傳遞的參數為 handleTag(true,”html”,output , xmlReader )
發現tag的閉合時,調用介面
介面傳遞的參數為 handleTag(false,”html”,output , xmlReader )
下面是一個實際執行的例子 給< strike> 標籤 中的文字加上橫線
public class MyHtmlTagHandler implements TagHandler {
public void handleTag(boolean opening, String tag, Editable output,
XMLReader xmlReader) {
if(tag.equalsIgnoreCase("strike") || tag.equals("s")) {
processStrike(opening, output);
}
}
private void processStrike(boolean opening, Editable output) {
int len = output.length();
if(opening) {
output.setSpan(new StrikethroughSpan(), len, len, Spannable.SPAN_MARK_MARK);
} else {
Object obj = getLast(output, StrikethroughSpan.class);
int where = output.getSpanStart(obj);
output.removeSpan(obj);
if (where != len) {
output.setSpan(new StrikethroughSpan(), where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
private Object getLast(Editable text, Class kind) {
Object[] objs = text.getSpans(0, text.length(), kind);
if (objs.length == 0) {
return null;
} else {
for(int i = objs.length;i>0;i--) {
if(text.getSpanFlags(objs[i-1]) == Spannable.SPAN_MARK_MARK) {
return objs[i-1];
}
}
return null;
}
}
}