转自:http://blog.it985.com/14433.html
1、SpannableString、SpannableStringBuilder与String的关系
首先SpannableString、SpannableStringBuilder基本上与String差不多,也是用来存储字符串,但它们俩的特殊就在于有一个SetSpan()函数,能给这些存储的String添加各种格式或者称样式(Span),将原来的String以不同的样式显示出来,比如在原来String上加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉,等等。所以,总而言之,SpannableString、SpannableStringBuilder与String一样, 首先也是传字符串,但SpannableString、SpannableStringBuilder可以对这些字符串添加额外的样式信息,但String则不行。
注意:如果这些额外信息能被所用的方式支持,比如将SpannableString传给TextView;也有对这些额外信息不支持的,比如前一章讲到的Canvas绘制文字,对于不支持的情况,SpannableString和SpannableStringBuilder就是退化为String类型,直接显示原来的String字符串,而不会再显示这些附加的额外信息。
2、SpannableString与SpannableStringBuilder区别
它们的区别在于 SpannableString像一个String一样,构造对象的时候传入一个String,之后再无法更改String的内容,也无法拼接多个 SpannableString;而SpannableStringBuilder则更像是StringBuilder,它可以通过其append()方法来拼接多个String;

3、SetSpan()
void setSpan (Object what, int start, int end, int flags) 函数意义:给SpannableString或SpannableStringBuilder特定范围的字符串设定Span样式,可以设置多个(比如同时加上下划线和删除线等),Falg参数标识了当在所标记范围前和标记范围后紧贴着插入新字符时的动作,即是否对新插入的字符应用同样的样式。 参数说明: object what :对应的各种Span,后面会提到;
int start:开始应用指定Span的位置,索引从0开始
int end:结束应用指定Span的位置,特效并不包括这个位置。比如如果这里数为3(即第4个字符),第4个字符不会有任何特效。从下面的例子也可以看出来。
int flags:取值有如下四个
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,后面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE :前后都包括。
下面写了个小demo,先看一下效果图:

 public class MainActivity extends Activity implements OnClickListener {
private TextView tv;
private Button underline_btn;
private Button strike_btn;
private Button style_btn;
private Button font_btn;
private Button color_btn1;
private Button color_btn2;
private Button url_btn;
private Button image_btn;
private Button maskfilte_btn;
private Button Rasterizer_btn;
private Button spannablestringbuilder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) this.findViewById(R.id.tv);
underline_btn = (Button) this.findViewById(R.id.underline_btn);
strike_btn = (Button) this.findViewById(R.id.strike_btn);
style_btn = (Button) this.findViewById(R.id.style_btn);
font_btn = (Button) this.findViewById(R.id.font_btn);
color_btn1 = (Button) this.findViewById(R.id.color_btn1);
color_btn2 = (Button) this.findViewById(R.id.color_btn2);
url_btn = (Button) this.findViewById(R.id.url_btn);
image_btn = (Button) this.findViewById(R.id.image_btn);
maskfilte_btn = (Button) this.findViewById(R.id.maskfilte_btn);
Rasterizer_btn = (Button) this.findViewById(R.id.Rasterizer_btn);
spannablestringbuilder = (Button) this.findViewById(R.id.spannablestringbuilder); underline_btn.setOnClickListener(this);
strike_btn.setOnClickListener(this);
style_btn.setOnClickListener(this);
font_btn.setOnClickListener(this);
color_btn1.setOnClickListener(this);
color_btn2.setOnClickListener(this);
url_btn.setOnClickListener(this);
image_btn.setOnClickListener(this);
maskfilte_btn.setOnClickListener(this);
Rasterizer_btn.setOnClickListener(this);
spannablestringbuilder.setOnClickListener(this); } @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.underline_btn:
addUnderLineSpan();
break;
case R.id.strike_btn:
addStrikeSpan();
break;
case R.id.style_btn:
addStyleSpan();
break;
case R.id.font_btn:
addFontSpan();
break;
case R.id.color_btn1:
addForeColorSpan();
break;
case R.id.color_btn2:
addBackColorSpan();
break;
case R.id.url_btn:
addUrlSpan();
break;
case R.id.image_btn:
addImageSpan();
break;
case R.id.maskfilte_btn:
addmaskfilteSpan();
break;
case R.id.Rasterizer_btn:
addRasterizerSpan();
break;
case R.id.spannablestringbuilder:
addspannablestringbuilderSpan();
break;
}
}
/**
* spannablestringbuilder
*/
private void addspannablestringbuilderSpan() {
SpannableStringBuilder ss=new SpannableStringBuilder("红色超链接斜体删除线绿色下划线图片:.");
//用颜色标记文本
ss.setSpan(new ForegroundColorSpan(Color.RED), , ,
//setSpan时需要指定的 flag,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括).
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//用超链接标记文本
ss.setSpan(new URLSpan("tel:4155551212"), , ,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//用样式标记文本(斜体)
ss.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), , ,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//用删除线标记文本
ss.setSpan(new StrikethroughSpan(), , ,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//用下划线标记文本
ss.setSpan(new UnderlineSpan(), , ,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//用颜色标记
ss.setSpan(new ForegroundColorSpan(Color.GREEN), , ,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//获取Drawable资源
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
d.setBounds(, , d.getIntrinsicWidth(), d.getIntrinsicHeight());
//创建ImageSpan
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
//用ImageSpan替换文本
ss.setSpan(span, , , Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.setText(ss);
tv.setMovementMethod(LinkMovementMethod.getInstance()); //实现文本的滚动
} /*
* Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
* Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
* Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,后面不包括。
* Spannable.SPAN_INCLUSIVE_INCLUSIVE :前后都包括。
*/
/**
* 光栅效果
*/
private void addRasterizerSpan() {
SpannableString spanText = new SpannableString("StrikethroughSpan");
spanText.setSpan(new StrikethroughSpan(), , , Spannable.
SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText); }
/**
* 修饰效果
*/
private void addmaskfilteSpan() {
SpannableString spanText = new SpannableString("benzlocke6666666");
int length = spanText.length();
//模糊(BlurMaskFilter)
MaskFilterSpan maskFilterSpan = new MaskFilterSpan(new BlurMaskFilter(, Blur.OUTER));
spanText.setSpan(maskFilterSpan, , length - , Spannable.
SPAN_INCLUSIVE_EXCLUSIVE);
//浮雕(EmbossMaskFilter)
maskFilterSpan = new MaskFilterSpan(new EmbossMaskFilter(new float[]{,,}, 1.5f, , ));
spanText.setSpan(maskFilterSpan, length - , length, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText); } /**
* 超链接
*/
private void addUrlSpan() {
SpannableString spanString = new SpannableString("超链接");
URLSpan span = new URLSpan("tel:0123456789");
spanString.setSpan(span, , , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanString); tv.setMovementMethod(LinkMovementMethod.getInstance());
} /**
* 文字背景颜色
*/
private void addBackColorSpan() {
SpannableString spanString = new SpannableString("文字背景颜色");
BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);
spanString.setSpan(span, , , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanString);
} /**
* 文字颜色
*/
private void addForeColorSpan() {
SpannableString spanString = new SpannableString("文字颜色");
ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);
spanString.setSpan(span, , , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanString);
} /**
* 字体大小
*/
private void addFontSpan() {
SpannableString spanString = new SpannableString("36号字体");
AbsoluteSizeSpan span = new AbsoluteSizeSpan();
spanString.setSpan(span, , , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanString);
} /**
* 粗体,斜体
*/
private void addStyleSpan() {
SpannableString spanString = new SpannableString("ABCDEF");
StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);
spanString.setSpan(span, , , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanString);
} /**
* 删除线
*/
private void addStrikeSpan() {
SpannableString spanString = new SpannableString("删除线");
StrikethroughSpan span = new StrikethroughSpan();
spanString.setSpan(span, , , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanString);
} /**
* 下划线
*/
private void addUnderLineSpan() {
SpannableString spanString = new SpannableString("下划线");
UnderlineSpan span = new UnderlineSpan();
spanString.setSpan(span, , , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanString);
} /**
* 图片
*/
private void addImageSpan() {
SpannableString spanString = new SpannableString(" ");
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
d.setBounds(, , d.getIntrinsicWidth(), d.getIntrinsicHeight());
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
spanString.setSpan(span, , , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanString);
}
}

SpannableString与SpannableStringBuilder使用的更多相关文章

  1. Android项目实战(一): SpannableString与SpannableStringBuilder(转)

    前言: 曾经在一些APP中的一些类似“帮助”“关于”的界面看过一行文字显示不同的颜色的效果,如下效果: 本软件是一款高.大.上的社区类软件. 一般来说,这应该是由一个TextView来显示的,但是自己 ...

  2. Android项目实战(一): SpannableString与SpannableStringBuilder

    原文:Android项目实战(一): SpannableString与SpannableStringBuilder 前言: 曾经在一些APP中的一些类似“帮助”“关于”的界面看过一行文字显示不同的颜色 ...

  3. SpannableString与SpannableStringBuilder

    一.概述 1.SpannableString.SpannableStringBuilder与String的关系 首先SpannableString.SpannableStringBuilder基本上与 ...

  4. *像word一样编辑复杂的文本:SpannableString 样式详介

    简介: 使用android.text.Spanned; android.text.SpannableString; android.text.SpannableStringBuilder; 和 and ...

  5. Android(java)学习笔记140:SpannableString类的使用

    我们之前说过了我们想实现在TextView组件之中,可以显示URL.Email等特殊信息,这些信息点击可以实现跳转,真正意义上的超链接 要实现上面的需求就要SpannableString这个类. 因为 ...

  6. 富文本 SpannableString Span

    经典使用场景 SpannableStringBuilder needStartSSB = new SpannableStringBuilder("需要"); SpannableSt ...

  7. Android 使用SpannableString显示复合文本

    http://blog.csdn.net/feizhixuan46789/article/details/10334441 http://www.th7.cn/Program/Android/2014 ...

  8. SpannableString

    http://blog.csdn.net/fengkuanghun/article/details/7904284 背景介绍 在开发应用过程中经常会遇到显示一些不同的字体风格的信息犹如默认的LockS ...

  9. Android(java)学习笔记82:利用SpannableString设置复合文本

    1. SpannableString设置复合文本: TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式.事件方面的设置.Android系统通过SpannableString类来 ...

随机推荐

  1. grafana使用小节

    安装准备 安装grafana 安装mysql grafana操作步骤 新建数据源,支持mysql 数据库连接失败处理: https://www.jianshu.com/p/684bc3a77ac9 新 ...

  2. tornado 07 数据库—ORM—SQLAlchemy—查询

    tornado 07 数据库—ORM—SQLAlchemy—查询 引言 #上节课使用query从数据库查询到了结果,但是query返回的对象是直接可用的吗 #在query.py内输入一下内容 from ...

  3. GCD(最大公约数)和LCM(最小公倍数)的求法

    GCD(最大公约数) (1)辗转相除法(欧几里得算法)(常用) 将两个数a, b相除,如果余数c不等于0,就把b的值给a,c的值给b,直到c等于0,此时最大公约数就是b (2)更相减损术 将两个书中较 ...

  4. C++_友元1-友元类是什么

    友元函数:不是类的成员函数,但是能够访问类的私有数据成员. 之前有个矛盾就是规定非成员函数不能直接访问类的私有数据,但是这会儿却可以,但那只是针对常规非成员函数而言,特殊的非成员函数就可以访问类的私有 ...

  5. WPF 一 概述

    创建一个项目吧 菜单>文件>新建>项目 看一看目录结构 WPF应用程序”会在“引用”里面自动添加下图中所示的 PresentationCore.PresentationFramewo ...

  6. selenium模块的而简单使用

    一.seleniu的简单使用 1.简单使用 ''' selenium:基于浏览器的自动化操作模块 通过代码定制一些浏览器自动化操作,然后把该操作作用到浏览器 1.pip install seleniu ...

  7. JS判断包括IE11在内的IE浏览器

    function isIE() { //ie? if (!!window.ActiveXObject || "ActiveXObject" in window) return tr ...

  8. Oracle 序列(自增ID)

    -- 创建序列CREATE SEQUENCE "JPADMIN"."SEQ_JP_BAS_USER_ID" MINVALUE 1 // 最小值MAXVALUE ...

  9. Macbook使用Gitlab配置SSH Key

    git是分布式代码管理工具,远程代码管理是基于ssh的,代码上传大搜gitlab或者github代码仓储时,需要进行ssh配置. 把本地代码上传到服务器时需要加密处理,git中公钥(id_rsa.pu ...

  10. javascript中构造函数与普通函数的区别还有关于“new”操作符的一些原理

    有一种创建对象的方法叫做工厂模式,例如: function person(name,age){ var o=new Object(); o.name=name; o.age=age; return o ...