Sep 21

Android:Spannable使用小记

Lrdcq , 2015/09/21 22:03 , 程序 , 閱讀(9858) , Via 本站原創
news参看文章,这个写得好
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压根没有长度,还说什么延展。
logo