Android中的SpannableStringBuilder的简单使用

今天天气不错,连带着的心情都非常好,所以撸完一篇再来一篇。本篇跟大家分享一个很强大的API——SpannableStringBuilder,这个东西前几天才在郭神分享的文章里面看到过,没想到昨天在项目中就遇到了,吓得我赶紧去回顾了一下。俗话说好记性不如烂笔头,遂将其记录下来,以供之后忘记的时候还能回过头来看看。

好了,废话不多说了,来看一下Google官方的介绍:This is the class for text whose content and markup can both be changed.意思是说,这个文本类的内容和标记都可以更改,听上去是不是感觉很强大呢,接下来一起看看它的主要方法有哪些?

它的最主要的一个方法是:setSpan(Object what, int start, int end, int flags) ,通过这个方法我们可以来改变文本的样式。该方法携带了四个参数,来简单说一下这几个参数都是什么意思。

第一个参数what代表的是各种不同的样式,可供使用的API有:

 

ForegroundColorSpan: 文本颜色

BackgroundColorSpan : 文本背景色

AbsoluteSizeSpan: 文本字体(绝对大小)

StyleSpan : 字体样式:粗体、斜体等

StrikethroughSpan : 删除线

ImageSpan : 图片

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

UnderlineSpan: 下划线

RasterizerSpan: 光栅效果

SuggestionSpan: 相当于占位符

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

RelativeSizeSpan: 相对大小(文本字体)

ScaleXSpan: 基于x轴缩放

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

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

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

TypefaceSpan : 文本字体

URLSpan: 文本超链接

第二个参数start是指定Span的开始位置,第三个参数end是指定Span的结束位置,第四个flags常量值的取值有四种情况,分别是:

 

Spannable.SPAN_EXCLUSIVE_INCLUSIVE:在 Span前面输入的字符不应用 Span的效果,在后面输入的字符应用Span效果

Spannable.SPAN_INCLUSIVE_EXCLUSIVE:在 Span前面输入的字符应用 Span 的效果,在后面输入的字符不应用Span效果

Spannable.SPAN_INCUJSIVE_INCLUSIVE:在 Span前后输入的字符都应用 Span 的效果

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括

下面来看一下具体在代码当中是如何使用的?由于可用API较多,在这里我并没有一一展示,简单的写了前面几个的使用方法,首先给大家来点直观的感受,先上一张效果图:

 

然后我们回到项目中来,先来看一下布局文件,在这里用了几个TextView控件,给每个TextView设置不同样式的文本,如上图中显示的那样:

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:id="@+id/id_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="文字"
        android:layout_margin="10dp"
        android:textSize="15sp"/>

    <TextView
        android:id="@+id/id_backgroud"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="文字"
        android:layout_margin="10dp"
        android:textSize="15sp"/>

    <TextView
        android:id="@+id/id_size"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="文字"
        android:layout_margin="10dp"
        android:textSize="15sp"/>

    <TextView
        android:id="@+id/id_textstyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="文字"
        android:layout_margin="10dp"
        android:textSize="15sp"/>

    <TextView
        android:id="@+id/id_strikethrough"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="文字"
        android:layout_margin="10dp"
        android:textSize="15sp"/>

    <TextView
        android:id="@+id/id_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="文字"
        android:layout_margin="10dp"
        android:textSize="15sp"/>

</LinearLayout>

首先来看设置文本颜色,就是效果图里面第一行的文本内容:

 

 

//设置文本颜色
private void setNormalText(){
    SpannableStringBuilder ssb = new SpannableStringBuilder();
    ssb.append("Hello Python!");
    ssb.append("Android开发");
    ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#F37400"));
    ssb.setSpan(colorSpan,0,13, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
    normalText.setText(ssb);
}

这里我们首先实例化SpannableStringBuilder这个类,然后通过append()这个方法为ssb这个类对象去追加内容,然后通过你想要设置的文本样式的Span去创建样式,通过setSpan()方法为ssb设置样式,具体参数上文中已给出了介绍,在这里不再赘述,最后我们通过我们的TextView控件的setText()方法将文本设置上去,通过这五步操作,我们就可以给一个普通的文本设置上你想要的样式。对,没错,就是仅仅使用一个TextView文本控件就可以完成复杂样式的设置,可见我们的SpannableStringBuilder是多么强大。

 

最后附项目MainActivity中的源码:

 

package com.example.myapplication;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.BackgroundColorSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.widget.TextView;

/**
 * @author Jarchie
 * @version 2016/12/30
 * 创建SpannableStringBuilder的Demo
 */
public class MainActivity extends Activity {
    //文本控件
    private TextView normalText,bgText,sizeText,styleText,strikeText,imageText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //绑定控件
        initView();
        //设置文本显示
        setNormalText();
        setBgText();
        setSizeText();
        setStyleText();
        setStrikeText();
        setImageText();
    }

    //初始化绑定控件
    private void initView(){
        normalText = (TextView) findViewById(R.id.id_text);
        bgText = (TextView) findViewById(R.id.id_backgroud);
        sizeText = (TextView) findViewById(R.id.id_size);
        styleText = (TextView) findViewById(R.id.id_textstyle);
        strikeText = (TextView) findViewById(R.id.id_strikethrough);
        imageText = (TextView) findViewById(R.id.id_image);
    }

    //设置文本颜色
    private void setNormalText(){
        SpannableStringBuilder ssb = new SpannableStringBuilder();
        ssb.append("Hello Python!");
        ssb.append("Android开发");
        ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#F37400"));
        ssb.setSpan(colorSpan,0,13, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
        normalText.setText(ssb);
    }

    //设置带有背景颜色的文本
    private void setBgText(){
        SpannableStringBuilder ssb = new SpannableStringBuilder();
        ssb.append("Hello Python!");
        ssb.append("Android开发");
        BackgroundColorSpan colorSpan = new BackgroundColorSpan(Color.parseColor("#F37400"));
        ssb.setSpan(colorSpan,0,13,Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
        bgText.setText(ssb);
    }

    //设置文本大小
    private void setSizeText(){
        SpannableStringBuilder ssb = new SpannableStringBuilder();
        ssb.append("Hello Python!");
        ssb.append("Android开发");
        AbsoluteSizeSpan sizeSpan = new AbsoluteSizeSpan(80);
        ssb.setSpan(sizeSpan,0,13,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        sizeText.setText(ssb);
    }

    //设置文本样式粗体斜体
    private void setStyleText(){
        SpannableStringBuilder ssb = new SpannableStringBuilder();
        ssb.append("Hello Python!");
        ssb.append("Android开发");
        StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
        ssb.setSpan(styleSpan,6,12,Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
        StyleSpan styleSpan1 = new StyleSpan(Typeface.ITALIC);
        ssb.setSpan(styleSpan1,13,20,Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
        styleText.setText(ssb);
    }

    //设置带有删除线的文本
    private void setStrikeText(){
        SpannableStringBuilder ssb = new SpannableStringBuilder();
        ssb.append("Hello Python!");
        ssb.append("Android开发");
        StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
        ssb.setSpan(strikethroughSpan,0,13,Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
        strikeText.setText(ssb);
    }

    //设置带有图片的文本
    private void setImageText(){
        SpannableStringBuilder ssb = new SpannableStringBuilder();
        ssb.append("Hello Python!");
        ssb.append("Android开发");
        ImageSpan imageSpan = new ImageSpan(this,R.mipmap.img);
        ssb.setSpan(imageSpan,12,13,Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
        imageText.setText(ssb);
    }

}

剩下的那些样式设置的API与上面类似,大家可以根据自己的需要进行使用。好了,SpannableStringBuilder就介绍这么多了,谢谢大家!欢迎批评指正!源码下载地址:http://download.csdn.net/detail/jianqi201314/9727017

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值