TextView是Android开发中一种很常用的控件,经常用来展示文字内容。但有的时候为了带来更好的用户体验,往往需要很炫的样式,如果只是通过使用多个TextView进行堆叠未免过于繁琐,因此我们使用SpannableString对于TextView进行设置。


1.普通的TextView


首先我们先来看一看一般的TextView,一般而言,每一个TextView包含一种字体和颜色。


在xml布局中添加一个TextView控件


<TextView
        android:textSize="25dp"
        android:id="@+id/text"
        android:text=""
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"/>

然后在Activity中对空间进行绑定


setContentView(R.layout.activity_main);
        TextView tv = (TextView)findViewById(R.id.text);

最后的样式如下图所示




android spannable android spannablestring查找 下一个_Android



2.构建SpannableString

当我们希望使用SpannableString设置字符串样式时,一般需要先创建一个SpannableString对象

SpannableString spanText = new SpannableString("");

然后调用setSpan方法对于样式进行设置


spanText.setSpan(new BackgroundColorSpan(Color.BLUE), 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

我们可以看到这个方法里面共有四个参数,第一个参数是用来指定实现某种效果(比如背景色,超链接等),第二个和第三个参数表示其实的位置和结束的位置,而第四个参数表示实现的类型,可以在Spanned.java中看到全部的类型,常用的有如下四种:



  • SPAN_EXCLUSIVE_EXCLUSIVE 不包含起点和终点
  • SPAN_EXCLUSIVE_INCLUSIVE  不包含起点但包含终点
  • SPAN_INCLUSIVE_EXCLUSIVE  包含起点但不包含终点
  • SPAN_INCLUSIVE_INCLUSIVE·  包含起点和终点


3.背景色


使用BackgroundColorSpan可以对背景色进行设置


spanText.setSpan(new BackgroundColorSpan(Color.BLUE), 4, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);



android spannable android spannablestring查找 下一个_android开发_02



4.前景色


使用ForegroundColorSpan可以对前景色进行设置


spanText.setSpan(new ForegroundColorSpan(Color.BLUE) , 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);


android spannable android spannablestring查找 下一个_android spannable_03



5.中划线


使用StrikethroughSpan可以实现文字的中划线效果


spanText.setSpan(new StrikethroughSpan(), 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);


android spannable android spannablestring查找 下一个_android开发_04



6.下划线


使用UnderlineSpan 可以实现文字的下划线效果


android spannable android spannablestring查找 下一个_textview_05




7.设置字号大小


使用AbsoluteSizeSpan可以改变字号的绝对大小,而RelativeSizeSpan 可以改变字体的相对大小(相对当前字号)


spanText.setSpan(new AbsoluteSizeSpan(40, true), 0,4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spanText.setSpan(new RelativeSizeSpan(2.5f), 0,4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);


android spannable android spannablestring查找 下一个_android开发_06



8.设置图片


通过DynamicDrawableSpan或ImageSpan可以将制定位置的字符替换成图片


DynamicDrawableSpan drawableSpan =
        new DynamicDrawableSpan(DynamicDrawableSpan.ALIGN_BASELINE) {
            @Override
            public Drawable getDrawable() {
                Drawable d = getResources().getDrawable(R.mipmap.ic_launcher);
                d.setBounds(0, 0, 50, 50);
                return d;
            }
        };



Drawable d = getResources().getDrawable(R.mipmap.ic_launcher);
        d.setBounds(0, 0, 50, 50);
        spanText.setSpan(new ImageSpan(d), 0,1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);




android spannable android spannablestring查找 下一个_textview_07



9.水平缩放


使用ScaleXSpan可以对字符串进行水平缩放


spanText.setSpan(new ScaleXSpan(2.5f), 0,5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);


android spannable android spannablestring查找 下一个_textview_08



10.改变字体样式


使用StyleSpan可以改变字体样式(斜体、粗体等),样式见Typeface


spanText.setSpan(new StyleSpan(Typeface.ITALIC), 0,5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);



android spannable android spannablestring查找 下一个_Android_09



11.上下角标


使用SubscriptSpan可以实现下角标


spanText.setSpan(new SubscriptSpan(), 0,1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);


android spannable android spannablestring查找 下一个_textview_10



类似的,可以使用SuperscriptSpan实现上角标


android spannable android spannablestring查找 下一个_Android_11




12.修改字体


使用TypefaceSpan可以修改文字字体,如果修改为自定义的字体,需要重写TypefaceSpan


spanText.setSpan(new TypefaceSpan("monospace"), 0,5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);


android spannable android spannablestring查找 下一个_textview_12



13.超链接


使用URLSpan可以实现超链接的效果


spanText.setSpan(new URLSpan(""), 0,5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        tv.setText(spanText);
        tv.setMovementMethod(new LinkMovementMethod());//点击事件



android spannable android spannablestring查找 下一个_a_13