版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
Spannable / 富文本的用途是丰富 Android TextView 的表现形式,如修改同一主体中某一部分文字的颜色、大小、样式、添加超链接以及添加图标,使得 TextView 功能与表现形式更强大!
以下为笔者部分实现,更多请移步Google官方资料
Spannable / 富文本的实现
ForegroundColorSpan 修改前景色
RelativeSizeSpan 修改文字大小(相对)
StyleSpan 修改字体风格
StrikethroughSpan / UnderlineSpan 添加中划线、下划线
ImageSpan 添加图标
SuperscriptSpan / SubscriptSpan 添加上、下标
URLSpan 添加超链接
完整源码
// 修改颜色
private void initSpan01(){
mSpItem01 = (TextView) findViewById(R.id.sp_item01);
SpannableString spStr = new SpannableString(mSpItem01.getText());
ForegroundColorSpan span = new ForegroundColorSpan(Color.parseColor("#436EEE"));
spStr.setSpan(span, 9,12, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mSpItem01.setText(spStr);
}
// 修改大小
private void initSpan02(){
mSpItem02 = (TextView) findViewById(R.id.sp_item02);
SpannableString spStr = new SpannableString(mSpItem02.getText());
RelativeSizeSpan span = new RelativeSizeSpan(1.5f);
spStr.setSpan(span, 12,14, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mSpItem02.setText(spStr);
}
// 修改样式
private void initSpan03(){
mSpItem03 = (TextView) findViewById(R.id.sp_item03);
SpannableString spStr = new SpannableString(mSpItem03.getText());
// 以修改为粗体为例,具体提供多少种样式可查看Typeface源码
StyleSpan span = new StyleSpan(Typeface.BOLD);
spStr.setSpan(span, 9,12, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mSpItem03.setText(spStr);
}
// 添加线条(span可以叠加添加,以下为添加中划线+下划线两种)
private void initSpan04(){
mSpItem04 = (TextView) findViewById(R.id.sp_item04);
SpannableString spStr = new SpannableString(mSpItem04.getText());
// 中划线
StrikethroughSpan strikeSpan = new StrikethroughSpan();
spStr.setSpan(strikeSpan, 9,12, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
// 下划线
UnderlineSpan underSpan = new UnderlineSpan();
spStr.setSpan(underSpan, 12,14, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mSpItem04.setText(spStr);
}
// 文末添加图标
private void initSpan05(){
mSpItem05 = (TextView) findViewById(R.id.sp_item05);
SpannableString spStr = new SpannableString("占位");
Drawable imageDrawable = this.getResources().getDrawable(R.drawable.robot_text_to_voicre);
imageDrawable.setBounds(0,0,50,50);
ImageSpan span = new ImageSpan(imageDrawable);
spStr.setSpan(span, 0 ,2, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mSpItem05.append(spStr);
}
// 上、下标(span可以叠加添加,以下为添加上标+标两种)
private void initSpan06(){
mSpItem06 = (TextView) findViewById(R.id.sp_item06);
SpannableString spStr = new SpannableString(mSpItem06.getText());
// 上标
SuperscriptSpan supSpan = new SuperscriptSpan();
spStr.setSpan(supSpan, 9 ,10, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
// 下标
SubscriptSpan subSpan = new SubscriptSpan();
spStr.setSpan(subSpan, 12 ,13, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mSpItem06.setText(spStr);
}
// 超链接
private void initSpan07(){
mSpItem07 = (TextView) findViewById(R.id.sp_item07);
SpannableString spStr = new SpannableString(mSpItem07.getText());
URLSpan span = new URLSpan("https://www.jianshu.com/p/b865915dea14");
spStr.setSpan(span, 12 ,spStr.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mSpItem07.setMovementMethod(LinkMovementMethod.getInstance());
mSpItem07.setHighlightColor(Color.parseColor("#36969696"));
mSpItem07.setText(spStr);
}