原标题:Android富文本Html源码详细解析
前言
Html能够通过Html标签来为文字设置样式,让TextView显示富文本信息,其只支持部分标签不是全部,具体支持哪些标签将分析中揭晓。
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.tv_html); String htmlString = "颜色
" + "链接<>br/>" + "大字体
"+ "小字体
"+ "加粗
"+ "斜体
" + "
标题一
" + "标题二
" + "" + "引用" + "
" + " 上标正常字体 下标
" + " 组合样式字体"; textView.setText(Html.fromHtml(htmlString));}
由此可以看出Html还是比较强大的一个东西呀!
使用Html.toHtml方法能够将带有样式效果的Spanned文本对象生成对应的Html格式,标签内的字符会被转译成,下面为WebView显示效果,部分效果与上面TextView显示的效果有差异,代码如下:
webView.loadData(Html.toHtml(Html.fromHtml(htmlString)),"text/html", "utf-8");
显示效果还是有点差距的,用的是安卓4.0.3的手机系统,所以可能显示上有点问题,不过应该不影响大家区分。重点毕竟不在这里,大家继续往下看原理吧!
原理分析
/** * 为标签提供图片检索功能 */
publicstaticinterfaceImageGetter{
/** * 当HTML解析器解析到标签时,source参数为标签中的src的属性值, * 返回值必须为Drawable;如果返回null则会使用小方块来显示,如前面所见, * 并需要调用Drawable.setBounds()方法来设置大小,否则无法显示图片。 * @paramsource: */publicDrawable getDrawable(String source);}
/*** HTML标签解析扩展接口*/
publicstaticinterfaceTagHandler{
/** * 当解析器解析到本身不支持或用户自定义的标签时,该方法会被调用 * @paramopening:标签是否打开 * @paramtag:标签名 * @paramoutput:截止到当前标签,解析到的文本内容 * @paramxmlReader:解析器对象 */publicvoid handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader);}
privateHtml() { }
/** * 返回样式文本,所有标签都会显示为一个小方块 * 使用TagSoup库处理HTML * @paramsource:带有html标签字符串 */
publicstaticSpanned fromHtml(String source) {
returnfromHtml(source, null, null);}
/*** 可传入ImageGetter来获取图片源,TagHandler添加支持其他标签*/
publicstaticSpanned fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler) { .....}
/*** 将带样式文本反向解析成带Html的字符串,注意这个方法并不是还原成fromHtml接收的带Html标签文本*/
publicstaticString toHtml(Spanned text) { StringBuilder out = newStringBuilder(); withinHtml(out, text);
returnout.toString();}
/*** 返回转译标签后的字符串*/
publicstaticString escapeHtml(CharSequence text) { StringBuilder out = newStringBuilder(); withinStyle(out, text, 0, text.length());
returnout.toString();}
/*** 懒加载HTML解析器的Holder* a) zygote对其进行预加载* b) 直到需要的时候才加载*/privatestaticclassHtmlParser{
privatestaticfinalHTMLSchema schema = newHTMLSchema();}。。。。
fromHtml(String source, ImageGetter imageGetter,TagHandler tagHandler):
Html类主要方法就4个,功能也简单,生成带样式的fromHtml方法最终都是调用重载3个参数的方法。
publicstaticSpanned fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler){
//初始化解析器Parser parser = newParser();
<