我们在Android应用开发的过程当中,经常会遇到改变TextView中部分字体的某些属性,以达到强调或者提示的作用。这些属性包括字体的颜色、大小、粗细等。遇到这种情况你该如何处理呢?
TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式、事件方面的设置。.通常情况下,我们是将一个字符串直接放置在TextView.setText()的参数里面的,这样只能单纯的输出字符串。如果要给TextView加上特殊的文本效果,就要使用SpannableString这个类了。 用法如下:
1、 new一个SpannableString对象,并将需要处理的字符串作为其构造函数的参数传入。
String orign = “万里长城万里空,百世英雄百世梦![清] 张廷玉”;
SpannableString span = new SpannableString(orign );
2、调用SpannableString的setSpan(Object what, int start, int end, int flags)方法进行设置。 参数说明:
what:需要设置的样式,目前Android提供了如下可设置的样式:
1、BackgroundColorSpan 背景色
span.setSpan(new BackgroundColorSpan(Color.GREEN), 0, spanText.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);2、ClickableSpan 文本可点击,有点击事件
3、ForegroundColorSpan 文本颜色(前景色)
span.setSpan(new ForegroundColorSpan(Color.BLUE), 6, spanText.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);4、MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
int length = orign .length();
//模糊(BlurMaskFilter)
MaskFilterSpan maskFilterSpan = new MaskFilterSpan(new BlurMaskFilter(3, Blur.OUTER));
span.setSpan(maskFilterSpan, 0, length - 10, Spannable.
SPAN_INCLUSIVE_EXCLUSIVE);
//浮雕(EmbossMaskFilter)
maskFilterSpan = new MaskFilterSpan(new EmbossMaskFilter(new float[]{1,1,3}, 1.5f, 8, 3));
span.setSpan(maskFilterSpan, length - 10, length, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
PS: 如果浮雕效果不明显,把字体设置大点后可以看得清晰些。需要其他效果可以继承MaskFilter来自定义。
- 5、MetricAffectingSpan 父类,一般不用
6、RasterizerSpan 光栅效果
span.setSpan(new StrikethroughSpan(), 0, 7, Spannable.
SPAN_INCLUSIVE_EXCLUSIVE);7、StrikethroughSpan 删除线(中划线)
span.setSpan(new StrikethroughSpan(), 0, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
8、SuggestionSpan 相当于占位符
相当于占位符,一般用在EditText输入框中。当双击此文本时,会弹出提示框选择一些建议(推荐的)文字,选中的文本将替换此占位符。在输入法上用的较多。
PS::API 14新增,暂无示例。9、UnderlineSpan 下划线
span.setSpan(new UnderlineSpan(), 0, spanText.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);10、AbsoluteSizeSpan 绝对大小(文本字体)
span.setSpan(new AbsoluteSizeSpan(20, true), 0, spanText.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
PS::把字体大小设置大点,效果更佳。
11、DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
//基于基线对齐
DynamicDrawableSpan drawableSpan =
new DynamicDrawableSpan(DynamicDrawableSpan.ALIGN_BASELINE) {
@Override
public Drawable getDrawable() {
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
d.setBounds(0, 0, 50, 50);
return d;
}
};
//基于底部对齐
DynamicDrawableSpan drawableSpan2 = new DynamicDrawableSpan(
DynamicDrawableSpan.ALIGN_BOTTOM) {
@Override
public Drawable getDrawable() {
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
d.setBounds(0, 0, 50, 50);
return d;
}
};
span.setSpan(drawableSpan, 3, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
span.setSpan(drawableSpan2, 7, 8, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);12、ImageSpan 图片(PS::和DynamicDrawableSpan差别不大)
13、RelativeSizeSpan 文本字体相对大小(PS::相对大小的比例是基于当前文本字体大小)
//参数proportion:比例大小
span.setSpan(new RelativeSizeSpan(2.5f), 3, 4,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);14、ReplacementSpan 父类,一般不用
15、ScaleXSpan 基于x轴缩放
//参数proportion:比例大小
span.setSpan(new ScaleXSpan(3.8f), 3, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);16、StyleSpan 字体样式:粗体、斜体等
//Typeface.BOLD_ITALIC:粗体+斜体
span.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 3, 7,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);17、SubscriptSpan 下标(数学公式会用到)
spanText.setSpan(new SubscriptSpan(), 6, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
18、SuperscriptSpan 上标(数学公式会用到)
span.setSpan(new SuperscriptSpan(), 6, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
19、TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
//若需自定义TextAppearance,可以在系统样式上进行修改
span.setSpan(new TextAppearanceSpan(this, android.R.style.TextAppearance_Medium),
6, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);PS: 系统还提供了相关值TextAppearance_Small, TextAppearance_Large等。如有需要可在以上样式基础上修改。
20、TypefaceSpan 文本字体
//若需使用自定义字体,可能要重写类TypefaceSpan
span.setSpan(new TypefaceSpan(“monospace”), 3, 10,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);21、URLSpan 文本超链接
span.setSpan(new URLSpan(“http://blog.csdn.net/RockyWDY/article/details/72888552“), 10, spanText.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
//让URLSpan可以点击
mTextView.setMovementMethod(new LinkMovementMethod());
start:开始的位置,0表示第一个字符
end:结束的位置,不包括end,改变的长度是end-start
flags:表示替换的位置是否会影响开头和结尾,试了一下,感觉没什么效果。
3、把这个span对象传给TextView.setText()方法的参数就好了。
TextView mTextView = new TextView(this);
mTextView.setText(span);