SpannableString&SpannableStringBuilder定制文本
今天突然发现安卓里竟然还有 SpannableString 和 SpannableStringBuilder 这么个玩意,学习了下,做点笔记在这。
两者都是用来存储字符串的,区别在于前者针对的是不可变文本,而后者则是针对可变文本。主要是两者有一个SetSpan()的方法,能够给他自己存储的String添加样式,比如在原来String上加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉,等等,这是他们俩优于String的地方。
两者的区别在于 SpannableString像一个String一样,构造对象的时候传入一个String,之后再无法更改String的内容,也无法拼接多个 SpannableString;而SpannableStringBuilder则更像是StringBuilder,它可以利用其append()方法来拼接多个String。
有关SetSpan()方法
void setSpan (Object what, int start, int end, int flags)
函数意义:给SpannableString或SpannableStringBuilder特定范围的字符串设定Span样式,可以设置多个(比如同时加上下划线和删除线等),Falg参数标识了当在所标记范围前和标记范围后紧贴着插入新字符时的动作,即是否对新插入的字符应用同样的样式。下面提一下这几个参数的含义:
Object what:对应各种span样式,
- SpannableString可供我们使用的API有下面这些:
BackgroundColorSpan 背景色
ClickableSpan 文本可点击,有点击事件
ForegroundColorSpan 文本颜色(前景色)
MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
MetricAffectingSpan 父类,一般不用
RasterizerSpan 光栅效果
StrikethroughSpan 删除线(中划线)
SuggestionSpan 相当于占位符
UnderlineSpan 下划线
AbsoluteSizeSpan 绝对大小(文本字体)
DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
ImageSpan 图片
RelativeSizeSpan 相对大小(文本字体)
ReplacementSpan 父类,一般不用
ScaleXSpan 基于x轴缩放
StyleSpan 字体样式:粗体、斜体等
SubscriptSpan 下标(数学公式会用到)
SuperscriptSpan 上标(数学公式会用到)
TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
TypefaceSpan 文本字体
URLSpan 文本超链接
int start:开始应用指定Span的位置,索引从0开始
int end:结束应用指定Span的位置,特效并不包括这个位置。
int flags:取值有如下四个
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,后面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE :前后都包括。
然后上DEMO截图和代码:
MainActivity.java代码
package com.example.dreamcreationman.androiddemo;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.BackgroundColorSpan;
import android.text.style.ImageSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView1=(TextView)findViewById(R.id.tv_1);
TextView textView2=(TextView)findViewById(R.id.tv_2);
SpannableString spannableString=new SpannableString("Hello Android! Hello Java!");
spannableString.setSpan(new BackgroundColorSpan(Color.RED),0,4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new UnderlineSpan(),5,10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new URLSpan("tel:4155551212"),11,16, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Drawable drawable=getResources().getDrawable(R.mipmap.ic_launcher);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
ImageSpan imageSpan=new ImageSpan(drawable,ImageSpan.ALIGN_BASELINE);
spannableString.setSpan(imageSpan,17,20, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView1.setText(spannableString);
}
}
好了有关Android Studio里SpannableString&SpannableStringBuilder定制文本的分享就到这里了,欢迎在评论区留言指出错误,希望和大家一起进步!
谢谢观看。