TextView官方加强版
0.介绍
- SpannableStringBuilder
可以拼接 - SpannableString
不可拼接
1.方法
改变文本样式
setSpan(Object what, int start, int end, int flags)
- start:开始位置
- end:结束位置,并不包括这个位置。
- flags:取值有如下四个
- Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不应用效果,后面应用效果。
- Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面应用效果,后面不应用效果。
- Spannable.SPAN_INCUJSIVE_INCLUSIVE:前后应用效果。
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括。
- what: 对应的各种Span,不同的Span对应不同的样式。已知的可用类有
- BackgroundColorSpan : 文本背景色
- ForegroundColorSpan : 文本颜色
- MaskFilterSpan : 修饰效果,如模糊(BlurMaskFilter)浮雕
- RasterizerSpan : 光栅效果
- StrikethroughSpan : 删除线
- SuggestionSpan : 相当于占位符
- UnderlineSpan : 下划线
- AbsoluteSizeSpan : 文本字体(绝对大小)
- DynamicDrawableSpan : 设置图片,基于文本基线或底部对齐。
- ImageSpan : 图片
- RelativeSizeSpan : 相对大小(文本字体)
- ScaleXSpan : 基于x轴缩放
- StyleSpan : 字体样式:粗体、斜体等
- SubscriptSpan : 下标(数学公式会用到)
- SuperscriptSpan : 上标(数学公式会用到)
- TextAppearanceSpan : 文本外貌(包括字体、大小、样式和颜色)
- TypefaceSpan : 文本字体
- URLSpan : 文本超链接
- ClickableSpan : 点击事件
3.使用实战
1.TextView
超链接布局
drawable
下 tv_link_selector.xml
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="#ffffff"/>
<item android:color="#FF364A61"/>
</selector>
2.TextView
布局
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColorLink="@drawable/tv_link_selector"
android:textSize="18dp"/>
3.calss
代码
/**
* 大体功能测试
*/
private void test() {
SpannableStringBuilder spsb = new SpannableStringBuilder("字体颜色。");
spsb.append("爷是有背景的人。");
spsb.append("爷说字体要大。");
spsb.append("爷要粗!");
spsb.append("葛优瘫了。");
spsb.append("加粗版的葛优瘫。");
spsb.append("加条删除线吧。");
spsb.append("来条下划线。");
spsb.append("图片");
spsb.append("有本事点我试试。");
// 设置--字体颜色
ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#009ad6"));
spsb.setSpan(colorSpan, 0, 5, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置--背景颜色
BackgroundColorSpan bgColorSpan = new BackgroundColorSpan(Color.parseColor("#009ad6"));
spsb.setSpan(bgColorSpan, 5, 13, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置--字体大小
AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(50);
spsb.setSpan(absoluteSizeSpan, 13, 20, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置--粗体
StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
spsb.setSpan(styleSpan, 20, 24, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置--斜体
StyleSpan styleSpan2 = new StyleSpan(Typeface.ITALIC);
spsb.setSpan(styleSpan2, 24, 29, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置--粗斜体
StyleSpan styleSpan3 = new StyleSpan(Typeface.BOLD_ITALIC);
spsb.setSpan(styleSpan3, 29, 37, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置--删除线
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
spsb.setSpan(strikethroughSpan, 37, 44, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置--下划线
UnderlineSpan underlineSpan = new UnderlineSpan();
spsb.setSpan(underlineSpan, 44, 50, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置--图片
ImageSpan imageSpan = new ImageSpan(this, R.mipmap.ic_launcher);
//也可以这样
//Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
//drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
//ImageSpan imageSpan1 = new ImageSpan(drawable);
//将index为50-52的字符用图片替代
spsb.setSpan(imageSpan, 50, 52, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置--点击事件
ClickableSpan cs = new ClickableSpan() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "安倍这老狗。", Toast.LENGTH_SHORT).show();
}
@Override
public void updateDrawState(TextPaint ds) {
// 超链接的文本颜色
ds.setColor(Color.parseColor("#009ad6"));
// 是否显示下划线
ds.setUnderlineText(false);
ds.clearShadowLayer();
}
};
spsb.setSpan(cs, 52, 60, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv1.setText(spsb);
// 设置--点击事件(相关)
tv1.setMovementMethod(LinkMovementMethod.getInstance());
}
2017-1-5 15:15:49