今天天气不错,连带着的心情都非常好,所以撸完一篇再来一篇。本篇跟大家分享一个很强大的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设置不同样式的文本,如上图中显示的那样:
首先来看设置文本颜色,就是效果图里面第一行的文本内容:
//设置文本颜色
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