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了。这样扩展性就好很多了。

猜你喜欢

转载自blog.csdn.net/tinson12321/article/details/81737175