天天看点

Android查缺补漏之SpannableString

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

1.普通的TextView

首先我们先来看一看一般的TextView,一般而言,每一个TextView包含一种字体和颜色。 在xml布局中添加一个TextView控件

<TextView
        android:textSize="25dp"
        android:id="@+id/text"
        android:text="http://blog.csdn.net/steveyg"
        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查缺补漏之SpannableString

2.构建SpannableString

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

SpannableString spanText = new SpannableString("http://blog.csdn.net/steveyg");
           

然后调用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查缺补漏之SpannableString

4.前景色

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

spanText.setSpan(new ForegroundColorSpan(Color.BLUE) , 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
           
Android查缺补漏之SpannableString

5.中划线

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

spanText.setSpan(new StrikethroughSpan(), 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
           
Android查缺补漏之SpannableString

6.下划线

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

Android查缺补漏之SpannableString

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查缺补漏之SpannableString

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查缺补漏之SpannableString

9.水平缩放

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

spanText.setSpan(new ScaleXSpan(2.5f), 0,5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
           
Android查缺补漏之SpannableString

10.改变字体样式

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

spanText.setSpan(new StyleSpan(Typeface.ITALIC), 0,5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
           
Android查缺补漏之SpannableString

11.上下角标

使用SubscriptSpan可以实现下角标

spanText.setSpan(new SubscriptSpan(), 0,1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
           
Android查缺补漏之SpannableString

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

Android查缺补漏之SpannableString

12.修改字体

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

spanText.setSpan(new TypefaceSpan("monospace"), 0,5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
           
Android查缺补漏之SpannableString

13.超链接

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

spanText.setSpan(new URLSpan("http://blog.csdn.net/steveyg"), 0,5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        tv.setText(spanText);
        tv.setMovementMethod(new LinkMovementMethod());//点击事件
           
Android查缺补漏之SpannableString

继续阅读