Android SpannableString的使用

SpannableString基本用法


SpannableString用于为TextView组件的文本内容设置样式,相当于文本内容的CSS。常用于TextView与EditText。使用方式如下:

//待显示文本
String str = "零一二三四五六七八九十";
//创建SpannableString对象
SpannableString spannableStr = new SpannableString(str);
//创建样式对象
ForegroundColorSpan fcs = new ForegroundColorSpan(Color.RED);
//绑定样式
spannableStr.setSpan(fcs, 1, 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
//显示
mEditText1.setText(spannableStr);

Android为了SpannableString设计了多种样式,常见的有文本颜色、字体样式(粗体,斜体)、删除线、下划线、链接效果等等。下面有对其详细介绍。
这里主要说一下setSpan方法,setSpan(Object what, int start, int end, int flags)方法需要传递四个对象,what表示样式,start表示格式字符串起始下标,end表示格式字符串终了下标,flags用于控制字符长度变化时改变字符的显示样式。flags常用属性包括以下四种:

  • Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    从start位置插入字符时应用样式,从end位置插入字符时不应用样式。
  • Spanned.SPAN_INCLUSIVE_INCLUSIVE
    从start位置以及end位置插入字符时都会应用样式。
  • Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
    从start位置以及end位置插入字符都不会应用样式。
  • Spanned.SPAN_EXCLUSIVE_INCLUSIVE
    从start位置插入字符时不会应用样式,从end位置插入字符时会应用样式。

flags不太容易理解,建议写个demo使用EditText亲自体验一下:

mEditText1 = (EditText) findViewById(R.id.editText1);
mEditText2 = (EditText) findViewById(R.id.editText2);
mEditText3 = (EditText) findViewById(R.id.editText3);
mEditText4 = (EditText) findViewById(R.id.editText4);

String str = "零一二三四五六七八九十";

SpannableString ss1 = new SpannableString(str);
SpannableString ss2 = new SpannableString(str);
SpannableString ss3 = new SpannableString(str);
SpannableString ss4 = new SpannableString(str);

ForegroundColorSpan fcs = new ForegroundColorSpan(Color.RED);

ss1.setSpan(fcs, 1, 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
ss2.setSpan(fcs, 1, 5, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
ss3.setSpan(fcs, 1, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss4.setSpan(fcs, 1, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);

mEditText1.setText(ss1);
mEditText2.setText(ss2);
mEditText3.setText(ss3);
mEditText4.setText(ss4);

常用样式


  1. BackgroundColorSpan 背景色
  2. ClickableSpan 文本可点击,有点击事件
  3. ForegroundColorSpan 文本颜色(前景色)
  4. MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
  5. MetricAffectingSpan 父类,一般不用
  6. RasterizerSpan 光栅效果
  7. StrikethroughSpan 删除线(中划线)
  8. SuggestionSpan 相当于占位符
  9. UnderlineSpan 下划线
  10. AbsoluteSizeSpan 绝对大小(文本字体)
  11. DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
  12. ImageSpan 图片
  13. RelativeSizeSpan 相对大小(文本字体)
  14. ReplacementSpan 父类,一般不用
  15. ScaleXSpan 基于x轴缩放
  16. StyleSpan 字体样式:粗体、斜体等
  17. SubscriptSpan 下标(数学公式会用到)
  18. SuperscriptSpan 上标(数学公式会用到)
  19. TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
  20. TypefaceSpan 文本字体
  21. URLSpan 文本超链接

SpannableStringBuilder



如果文本内容或文本样式需要经常变换,,则SpannableStringBuilder 会是更好的选择,其使用步凑与SpannableString无异,但SpannableStringBuilder 提供更强大的操作。例如:追加字符、删除字符、替换字符、增加样式等。其常用函数有:

  • append(CharSequence text)
    为字符串尾部增加字符。
  • append(CharSequence text, Object what, int flags)
    为字符串尾部增加字符,并提供样式。注意该函数added in API level 21。
  • append(CharSequence text, int start, int end)
    为字符串尾部增加指定字符,start和end用于指定字符内容。
  • replace(int start, int end, CharSequence tb)
    替换字符。start和end用于指定原始字符中被替换的部分。
  • replace(int start, int end, CharSequence tb, int tbstart, int tbend)
    替换字符,start和end用于指定原始字符中被替换的部分,tbstart和tbend用于指定替换内容。
  • insert(int where, CharSequence tb)
    插入字符。where指定插入位置,0表示从字符串前部追加。

参考文献:
用SpannableString打造绚丽多彩的文本显示效果
其实你不懂:Android之Spanned flag
android.text.SpannableStringBuilder

发布了36 篇原创文章 · 获赞 85 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/u012719153/article/details/78551919