androidhtml.fromhtml字体⼤⼩,androidHtml.fromHtml。。。由于在android 中的Html源码中对html标签的⽀持不是很完全,在使⽤textview加载html⾃定义字体样式的时候遇到坑了,就是font标签不⽀持size属性,查看源码中发现没有去解析size属性
// Html源码部分
private static void startFont(SpannableStringBuilder text,
Attributes attributes) {
// 解析颜⾊
String color = Value("", "color");
// 解析face
String face = Value("", "face");
int len = text.length();
text.setSpan(new Font(color, face), len, len, Spannable.SPAN_MARK_MARK);
}
所以如下这样写size是没有效果的,只显⽰颜⾊
String text = "" + "要显⽰的数据" + "";
Spanned spanned = Html.fromHtml(text);
==>>>>>>>>>>>>>>>>>>>>>分割线>>>>>>>>>>>>>>>>>>>>>==
由于android对html标签解析最终也是通过各种span进⾏拼接形成对应的样式:
以下是android中提供的各种span及⽤途
BackgroundColorSpan 背景⾊ ClickableSpan ⽂本可点击,有点击事件 ForegroundColorSpan ⽂本颜⾊(前景⾊) MaskFilterSpan修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter) MetricAffectingSpan ⽗类,⼀般不⽤ RasterizerSpan 光栅效果StrikethroughSpan 删除线(中划线) SuggestionSpan 相当于占位符 UnderlineSpan 下划线 AbsoluteSizeSpan 绝对⼤⼩(⽂本字体) DynamicDrawableSpan 设置图⽚,基于⽂本基线或底部对齐。 ImageSpan 图⽚ RelativeSizeSpan 相对⼤⼩(⽂本字体) ReplacementSpan ⽗类,⼀般不⽤ ScaleXSpan 基于x轴缩放 StyleSpan 字体样
式:粗体、斜体等 SubscriptSpan 下标(数学公式会⽤到) SuperscriptSpan 上标(数学公式会⽤到) TextAppearanceSpan ⽂本外貌(包括字体、⼤⼩、样式和颜⾊) TypefaceSpan ⽂本字体URLSpan ⽂本超链接
接下来我们就通过Html.TagHandler来⾃定义标签实现设置字体⼤⼩的功能 此处我定义标签名为:myfont
此处的调⽤⽅式如下:
String text = "" + "要显⽰的数据" + "";
Spanned spanned = Html.fromHtml(text, null, new HtmlTagHandler("myfont"));
关键代码在HtmlTagHandler⾥⾯处理⾃定义标签myfont:
public class HtmlTagHandler implements Html.TagHandler {
// ⾃定义标签名称
private String tagName;
/
/ 标签开始索引
private int startIndex = 0;
// 标签结束索引
private int endIndex = 0;
// 存放标签所有属性键值对
final HashMap attributes = new HashMap<>();
public HtmlTagHandler(String tagName) {
this.tagName = tagName;
}
@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { // 判断是否是当前需要的tag
if (tag.equalsIgnoreCase(tagName)) {
// 解析所有属性值
parseAttributes(xmlReader);
if (opening) {
startHandleTag(tag, output, xmlReader);
}
else {
endEndHandleTag(tag, output, xmlReader);
}
}
}
public void startHandleTag(String tag, Editable output, XMLReader xmlReader) {
startIndex = output.length();
}
public void endEndHandleTag(String tag, Editable output, XMLReader xmlReader) {
endIndex = output.length();
// 获取对应的属性值
String color = ("color");
String size = ("size");
size = size.split("px")[0];
// 设置颜⾊
if (!TextUtils.isEmpty(color)) {
output.setSpan(new ForegroundColorSpan(Color.parseColor(color)), startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
// 设置字体⼤⼩
if (!TextUtils.isEmpty(size)) {
output.setSpan(new AbsoluteSizeSpan(Integer.parseInt(size)), startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
/**
* 解析所有属性值
*
* @param xmlReader
*/
private void parseAttributes(final XMLReader xmlReader) {
try {
Field elementField = Class().getDeclaredField("theNewElement"); elementField.setAccessible(true);
Object element = (xmlReader);
Field attsField = Class().getDeclaredField("theAtts");
attsField.setAccessible(true);
Object atts = (element);
Field dataField = Class().getDeclaredField("data");
dataField.setAccessible(true);
String[] data = (String[]) (atts);
Field lengthField = Class().getDeclaredField("length");
lengthField.setAccessible(true);
int len = (Integer) (atts);
html span 居中for (int i = 0; i < len; i++) {
attributes.put(data[i * 5 + 1], data[i * 5 + 4]);
}
} catch (Exception e) {
}
}
}
如果以下⽅式没有效果:
String text = "" + "要显⽰的数据" + "";
Spanned spanned = Html.fromHtml(text, null, new HtmlTagHandler("myfont"));可在myfont标签前⾯添加⼀个随意标签实现如:
String text = "
" + "要显⽰的数据" + "
";
Spanned spanned = Html.fromHtml(text, null, new HtmlTagHandler("myfont"));如果不想⾃定义tag显⽰字体⼤⼩和颜⾊可参考
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论