天天看点

Android TextView 设置不同字体样式神器SpannableString

TextView相信大家都不陌生,在Android代码中无处不在。常规的用法是一个TextView里面只有一种字体样式,如果想设置花样TextView,就需要用到SpannableString了。下面给大家介绍一个SpannableString的常规用法。

SpannableString关键的方法就两个:

 public void setSpan(Object what, int start, int end, int flags) {}

 public void removeSpan(Object what) {}    

remove方法相信大家都懂了,就是移除样式。下面重点给大家分析一下setSpan方法。setSpan方法有四个参数:

Object what:指各种Span的类型,详见下面说明。

int start:需要设置的文字的起始位置;

int end:需要设置的文字的结束位置;

int flag:这个参数主要是设置span的起始和结束位置包含或不包含的类型。主要有四种类型,详见下面说明。

flag取值:

  • Spannable. SPAN_INCLUSIVE_EXCLUSIVE

    :前面包括,后面不包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本不会应用该样式;
  • Spannable. SPAN_INCLUSIVE_INCLUSIVE

    :前面包括,后面包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本也会应用该样式;
  • Spannable. SPAN_EXCLUSIVE_EXCLUSIVE

    :前面不包括,后面不包括,同上;
  • Spannable. SPAN_EXCLUSIVE_INCLUSIVE

    :前面不包括,后面包括,同上。

what常用取值:

  • BackgroundColorSpan

     : 文本背景色
  • ForegroundColorSpan

     : 文本颜色
  • MaskFilterSpan

     : 修饰效果,如模糊(BlurMaskFilter)浮雕
  • RasterizerSpan

     : 光栅效果
  • StrikethroughSpan

     : 删除线
  • SuggestionSpan

     : 相当于占位符
  • UnderlineSpan

     : 下划线
  • AbsoluteSizeSpan

     : 文本字体(绝对大小),这里有两个参数 (int size, boolean dip),size:默认单位为px。 dip:true为size的单位是dip,false为px。
  • DynamicDrawableSpan

     : 设置图片,基于文本基线或底部对齐。
  • ImageSpan

     : 图片
  • RelativeSizeSpan

     : 相对大小(文本字体)
  • ScaleXSpan

     : 基于x轴缩放
  • StyleSpan

     : 字体样式:粗体、斜体等
  • SubscriptSpan

     : 下标(数学公式会用到)
  • SuperscriptSpan

     : 上标(数学公式会用到)
  • TextAppearanceSpan

     : 文本外貌(包括字体、大小、样式和颜色)
  • TypefaceSpan

     : 文本字体
  • URLSpan

     : 文本超链接
  • ClickableSpan

     : 点击事件  在设置ClickableSpan的时候千万别忘了setMovementMethod。

关于what参数的更详细用法可以参考:https://blog.csdn.net/qq_16430735/article/details/50427978

下面贴出简单应用代码:

Spannable spannable = new SpannableString("SpanableString设置不同字体样式神器");
spannable.setSpan(new StyleSpan(Typeface.BOLD), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new AbsoluteSizeSpan(15,true),3,8,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textview.setText(spannable);
           

最后,分享一个小经验:

之前在封装自定义组件的时候,总会把设置文字的方法写成setContent(String content);参数类型为String,导致后面想修改一下text文字的不同样式都比较麻烦。

我们们可以改成setContent(CharSequence content),参数类型为CharSequence,我们就可以直接传SpannableString或者String了。这样扩展性就好很多了。

继续阅读