SpannableString基本用法
SpannableString用于为TextView组件的文本内容设置样式,相当于文本内容的CSS。常用于TextView与EditText。使用方式如下:
//待显示文本
String str = "零一二三四五六七八九十";
//创建SpannableString对象
SpannableString spannableStr = new SpannableString(str);
//创建样式对象
ForegroundColorSpan fcs = new ForegroundColorSpan(Color.RED);
//绑定样式
spannableStr.setSpan(fcs, 1, 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
//显示
mEditText1.setText(spannableStr);
Android为了SpannableString设计了多种样式,常见的有文本颜色、字体样式(粗体,斜体)、删除线、下划线、链接效果等等。下面有对其详细介绍。
这里主要说一下setSpan方法,setSpan(Object what, int start, int end, int flags)方法需要传递四个对象,what表示样式,start表示格式字符串起始下标,end表示格式字符串终了下标,flags用于控制字符长度变化时改变字符的显示样式。flags常用属性包括以下四种:
- Spanned.SPAN_INCLUSIVE_EXCLUSIVE
从start位置插入字符时应用样式,从end位置插入字符时不应用样式。 - Spanned.SPAN_INCLUSIVE_INCLUSIVE
从start位置以及end位置插入字符时都会应用样式。 - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
从start位置以及end位置插入字符都不会应用样式。 - Spanned.SPAN_EXCLUSIVE_INCLUSIVE
从start位置插入字符时不会应用样式,从end位置插入字符时会应用样式。
flags不太容易理解,建议写个demo使用EditText亲自体验一下:
mEditText1 = (EditText) findViewById(R.id.editText1);
mEditText2 = (EditText) findViewById(R.id.editText2);
mEditText3 = (EditText) findViewById(R.id.editText3);
mEditText4 = (EditText) findViewById(R.id.editText4);
String str = "零一二三四五六七八九十";
SpannableString ss1 = new SpannableString(str);
SpannableString ss2 = new SpannableString(str);
SpannableString ss3 = new SpannableString(str);
SpannableString ss4 = new SpannableString(str);
ForegroundColorSpan fcs = new ForegroundColorSpan(Color.RED);
ss1.setSpan(fcs, 1, 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
ss2.setSpan(fcs, 1, 5, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
ss3.setSpan(fcs, 1, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss4.setSpan(fcs, 1, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
mEditText1.setText(ss1);
mEditText2.setText(ss2);
mEditText3.setText(ss3);
mEditText4.setText(ss4);
常用样式
- BackgroundColorSpan 背景色
- ClickableSpan 文本可点击,有点击事件
- ForegroundColorSpan 文本颜色(前景色)
- MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
- MetricAffectingSpan 父类,一般不用
- RasterizerSpan 光栅效果
- StrikethroughSpan 删除线(中划线)
- SuggestionSpan 相当于占位符
- UnderlineSpan 下划线
- AbsoluteSizeSpan 绝对大小(文本字体)
- DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
- ImageSpan 图片
- RelativeSizeSpan 相对大小(文本字体)
- ReplacementSpan 父类,一般不用
- ScaleXSpan 基于x轴缩放
- StyleSpan 字体样式:粗体、斜体等
- SubscriptSpan 下标(数学公式会用到)
- SuperscriptSpan 上标(数学公式会用到)
- TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
- TypefaceSpan 文本字体
- URLSpan 文本超链接
SpannableStringBuilder
如果文本内容或文本样式需要经常变换,,则SpannableStringBuilder 会是更好的选择,其使用步凑与SpannableString无异,但SpannableStringBuilder 提供更强大的操作。例如:追加字符、删除字符、替换字符、增加样式等。其常用函数有:
- append(CharSequence text)
为字符串尾部增加字符。 - append(CharSequence text, Object what, int flags)
为字符串尾部增加字符,并提供样式。注意该函数added in API level 21。 - append(CharSequence text, int start, int end)
为字符串尾部增加指定字符,start和end用于指定字符内容。 - replace(int start, int end, CharSequence tb)
替换字符。start和end用于指定原始字符中被替换的部分。 - replace(int start, int end, CharSequence tb, int tbstart, int tbend)
替换字符,start和end用于指定原始字符中被替换的部分,tbstart和tbend用于指定替换内容。 - insert(int where, CharSequence tb)
插入字符。where指定插入位置,0表示从字符串前部追加。
参考文献:
用SpannableString打造绚丽多彩的文本显示效果
其实你不懂:Android之Spanned flag
android.text.SpannableStringBuilder