Sep
21
news参看文章,这个写得好
Spannable是啥?Spannable是设置文字样式的基础类,它引出和相关的一大堆类无非就做了一件事:告诉我这个文字样式是啥到底怎么渲染有些什么效果。

这是Spannable在文字相关类中的关系图,包括SpannedString在类的,所有Spanned都是继承于Spannable接口,这和String和StringBuilder并列为三大字符串类。如果说String为普通字符串,StringBuilder是高级动态字符串,那么Spanned就是附带样式的高级字符串了,而所谓Spannable,就是描述的这个字符串的样式部分。
1.Spannable使用方法
Spannable在很多地方有使用到。
最基本的是:
把字符串变成SpannedString对象,使用setSpan方法对字符串start到end区间设定whatspan的效果。然后就可以使用啦。
高级用法,导入html,使用HTML.fromHtml方法来自动生成SpannedString,原始字符串的来源可以是fromHtml的入参字符串,也可以是xml里的预定字符串。
在textview等文本空间中有一些xml属性也可以设置一些特殊字体效果,比如android:autoLink就可以识别出超链接并设置样式。
2.Span样式
各种预设的span类为我们带来了各种各样的样式,这些span分为两类,
- 一类是CharacterStyle,也就是说是针对单个字符可以设置的样式
- 另一类是ParagraphStyle,是针对段落进行的操作,ParagraphStyle的span运行的时候会检测目标段落前后是否有\n,如果没有的话会抛出错误"PARAGRAPH span must start at paragraph boundary",这是一个大坑请务必要注意。
在此我们一一罗列一下到底有哪些span。
首先是CharacterStyle类型的:
- AbsoluteSizeSpan(int size),用一个绝对的大小设置文字字号。

- BackgroundColorSpan(int color),设置文字背景颜色(纯色)。

- ClickableSpan,抽象类,可点击的文字。
- DynamicDrawableSpan,抽象类,可添加图像的文字。
- ForegroundColorSpan(int color),就是文字颜色。

- ImageSpan,前面放了一个图片的文字,入参可以是Bitmap,Drawable,Uri等,并且可以设置对齐方式。

可以看见上面那句话直接被替换为图片了。
LocaleSpan(Locale locale),改变文字的语言所属,新api。
没法看效果。。。
- MaskFilterSpan(MaskFilter filter),为文字添加滤镜,系统提供的滤镜只有两种:BlurMaskFilter模糊滤镜与EmbossMaskFilter浮雕滤镜。

BlurMaskFilter在纵向截取无效,不知道为什么,EmbossMaskFilter需要关闭硬件加速才有效。
- MetricAffectingSpan,抽象类,改变文字的大小高宽。
- RasterizerSpan(Rasterizer r),带光栅效果的文字。
不知为何无效,也许有版本问题。
- RelativeSizeSpan(float proportion),字号大小设为和一个字号相对比例的数值。

(2.5倍)
- ReplacementSpan,抽象类,可以被重绘的文字。
- ScaleXSpan(float proportion),以x轴按比例缩放的文字。

横向1.2倍
- StrikethroughSpan,带删除线的文字。

- StyleSpan(int style),传入一个style的id,可以用style来设置样式的文字。
- SubscriptSpan,下标文字,在靠下。

- SuggestionSpan,提示符文字,在文字对应目标上进行提示。

只对可编辑的文字有效,并且提示形式由rom决定。在这里是下划线。
- SuperscriptSpan,上标文字,靠上。

- TextAppearanceSpan,使用描述文字样式的方法统一改变文字样式,各种方法的集合体,常用。
- TypefaceSpan(String family),有特定字体的文字。

- URLSpan(String url),带超链接的文字。

文本点击无效。。。。
- UnderlineSpan,带下划线的文字。

然后是ParagraphStyle类型的,ParagraphStyle类型的接口更多:
- AlignmentSpan,接口,可以对齐的段落,主要包括如下
- AlignmentSpan.Standard(Layout.Alignment align)实现,段落可以靠左(ALIGN_NORMAL),居中(ALIGN_CENTER),靠右(ALIGN_OPPOSITE)对齐。

居中
- BulletSpan,着重段落,前面会加一个小圆点之类的。

- DrawableMarginSpan(Drawable b,int pad),图片对齐段落,放一个图片和一个段落对齐,可以用于图文混排。

在段落前添加,然而图片并不会进行行高计算。
- IconMarginSpan这个很相似,只不过变成了图标。

透明莫名其妙,也许是默认图标样式。
- LeadingMarginSpan,接口,对开始的某些行进行margin计算:
- LeadingMarginSpan.Standard(int first, int rest),来计算首末尾行列的margin设置。

10个像素的margin。
- LineBackgroundSpan,接口,自定义行背景。
- LineHeightSpan,接口,自定义行高计算方式。
- QuoteSpan(@ColorInt int color),引用段落,在段落前面加个表示引用的竖线,颜色自己定。

- TabStopSpan,接口,制表符偏移功能的接口。
- TabStopSpan.Standard(int where),制表符偏移的标准实现,入参是偏移量。

- WrapTogetherSpan,接口,它什么也没做~
3.Flag标示
在setspan的时候需要传入一个int的flag标示,有很多不同的用处和设定,在span上使用的flag主要规定了在编辑span中的文字时,span的范围如何延展:
- SPAN_INCLUSIVE_INCLUSIVE
- SPAN_MARK_POINT:前后新增字符都延展。
- SPAN_INCLUSIVE_EXCLUSIVE
- SPAN_MARK_MARK:前延展后不变。
- SPAN_EXCLUSIVE_INCLUSIVE
- SPAN_POINT_POINT:前不变后延展。
- SPAN_EXCLUSIVE_EXCLUSIVE
- SPAN_POINT_MARK:范围永远不动了。
- SPAN_PARAGRAPH:这丫是一个段落,如果是增加在本行,就延展,其他段落就不过去了。
- SPAN_POINT_MARK_MASK:这个span压根没有长度,还说什么延展。
Spannable是啥?Spannable是设置文字样式的基础类,它引出和相关的一大堆类无非就做了一件事:告诉我这个文字样式是啥到底怎么渲染有些什么效果。
这是Spannable在文字相关类中的关系图,包括SpannedString在类的,所有Spanned都是继承于Spannable接口,这和String和StringBuilder并列为三大字符串类。如果说String为普通字符串,StringBuilder是高级动态字符串,那么Spanned就是附带样式的高级字符串了,而所谓Spannable,就是描述的这个字符串的样式部分。
1.Spannable使用方法
Spannable在很多地方有使用到。
最基本的是:
String string = "palapala";
SpannableString spannableString = new SpannableString(string);
spannableString.setSpan(new WhatSpan(), start, end, flags);
textView.setText(spannableString);
把字符串变成SpannedString对象,使用setSpan方法对字符串start到end区间设定whatspan的效果。然后就可以使用啦。
高级用法,导入html,使用HTML.fromHtml方法来自动生成SpannedString,原始字符串的来源可以是fromHtml的入参字符串,也可以是xml里的预定字符串。
在textview等文本空间中有一些xml属性也可以设置一些特殊字体效果,比如android:autoLink就可以识别出超链接并设置样式。
2.Span样式
各种预设的span类为我们带来了各种各样的样式,这些span分为两类,
- 一类是CharacterStyle,也就是说是针对单个字符可以设置的样式
- 另一类是ParagraphStyle,是针对段落进行的操作,ParagraphStyle的span运行的时候会检测目标段落前后是否有\n,如果没有的话会抛出错误"PARAGRAPH span must start at paragraph boundary",这是一个大坑请务必要注意。
在此我们一一罗列一下到底有哪些span。
首先是CharacterStyle类型的:
- AbsoluteSizeSpan(int size),用一个绝对的大小设置文字字号。
- BackgroundColorSpan(int color),设置文字背景颜色(纯色)。
- ClickableSpan,抽象类,可点击的文字。
- DynamicDrawableSpan,抽象类,可添加图像的文字。
- ForegroundColorSpan(int color),就是文字颜色。
- ImageSpan,前面放了一个图片的文字,入参可以是Bitmap,Drawable,Uri等,并且可以设置对齐方式。
可以看见上面那句话直接被替换为图片了。
LocaleSpan(Locale locale),改变文字的语言所属,新api。
没法看效果。。。
- MaskFilterSpan(MaskFilter filter),为文字添加滤镜,系统提供的滤镜只有两种:BlurMaskFilter模糊滤镜与EmbossMaskFilter浮雕滤镜。
BlurMaskFilter在纵向截取无效,不知道为什么,EmbossMaskFilter需要关闭硬件加速才有效。
- MetricAffectingSpan,抽象类,改变文字的大小高宽。
- RasterizerSpan(Rasterizer r),带光栅效果的文字。
不知为何无效,也许有版本问题。
- RelativeSizeSpan(float proportion),字号大小设为和一个字号相对比例的数值。
(2.5倍)
- ReplacementSpan,抽象类,可以被重绘的文字。
- ScaleXSpan(float proportion),以x轴按比例缩放的文字。
横向1.2倍
- StrikethroughSpan,带删除线的文字。
- StyleSpan(int style),传入一个style的id,可以用style来设置样式的文字。
- SubscriptSpan,下标文字,在靠下。
- SuggestionSpan,提示符文字,在文字对应目标上进行提示。
只对可编辑的文字有效,并且提示形式由rom决定。在这里是下划线。
- SuperscriptSpan,上标文字,靠上。
- TextAppearanceSpan,使用描述文字样式的方法统一改变文字样式,各种方法的集合体,常用。
- TypefaceSpan(String family),有特定字体的文字。
- URLSpan(String url),带超链接的文字。
文本点击无效。。。。
- UnderlineSpan,带下划线的文字。
然后是ParagraphStyle类型的,ParagraphStyle类型的接口更多:
- AlignmentSpan,接口,可以对齐的段落,主要包括如下
- AlignmentSpan.Standard(Layout.Alignment align)实现,段落可以靠左(ALIGN_NORMAL),居中(ALIGN_CENTER),靠右(ALIGN_OPPOSITE)对齐。
居中
- BulletSpan,着重段落,前面会加一个小圆点之类的。
- DrawableMarginSpan(Drawable b,int pad),图片对齐段落,放一个图片和一个段落对齐,可以用于图文混排。
在段落前添加,然而图片并不会进行行高计算。
- IconMarginSpan这个很相似,只不过变成了图标。
透明莫名其妙,也许是默认图标样式。
- LeadingMarginSpan,接口,对开始的某些行进行margin计算:
- LeadingMarginSpan.Standard(int first, int rest),来计算首末尾行列的margin设置。
10个像素的margin。
- LineBackgroundSpan,接口,自定义行背景。
- LineHeightSpan,接口,自定义行高计算方式。
- QuoteSpan(@ColorInt int color),引用段落,在段落前面加个表示引用的竖线,颜色自己定。
- TabStopSpan,接口,制表符偏移功能的接口。
- TabStopSpan.Standard(int where),制表符偏移的标准实现,入参是偏移量。
- WrapTogetherSpan,接口,它什么也没做~
3.Flag标示
在setspan的时候需要传入一个int的flag标示,有很多不同的用处和设定,在span上使用的flag主要规定了在编辑span中的文字时,span的范围如何延展:
- SPAN_INCLUSIVE_INCLUSIVE
- SPAN_MARK_POINT:前后新增字符都延展。
- SPAN_INCLUSIVE_EXCLUSIVE
- SPAN_MARK_MARK:前延展后不变。
- SPAN_EXCLUSIVE_INCLUSIVE
- SPAN_POINT_POINT:前不变后延展。
- SPAN_EXCLUSIVE_EXCLUSIVE
- SPAN_POINT_MARK:范围永远不动了。
- SPAN_PARAGRAPH:这丫是一个段落,如果是增加在本行,就延展,其他段落就不过去了。
- SPAN_POINT_MARK_MASK:这个span压根没有长度,还说什么延展。