项目中有个需求,需要对一句话中的部分字体加粗。于是查到了spannableString可以实现这个需求。
主要是spannableString中的setSpan方法,四个can参数分别为:
1,文本所要使用的资源(可以是字体大小,颜色,样式,超链接,下划线等)
2,应用该资源的文本的起始位置
3,应用该资源的文本的结束位置(含前不含后,java的范围设置基本都是含前不含后)
4,只有四种,由exclusive和incluesive组合而成,exclusive:独立的 inclusive:包含的 。比如
SPAN_EXCLUSIVE_INCLUSIVE,则是前面不应用该样式,后面的应用,因为“EXCLUSIVE_INCLUSIVE”前面是exclusive,hou'后面是“inclusive”。
具体代码如下:
SpannableString spannableString = new SpannableString("红色打电话斜体下划线图片变大变小注释");
//颜色标记文本
spannableString.setSpan(new ForegroundColorSpan(Color.RED), 0, 2, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
//超链接标记文本 还需要设置 tx.setMovementMethod(LinkMovementMethod.getInstance()); 不然不会跳到拨号界面
spannableString.setSpan(new URLSpan("tel:13810220405"), 2, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置部分文本点击事件 还需要设置 tx.setMovementMethod(LinkMovementMethod.getInstance());
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "打电话", Toast.LENGTH_SHORT).show();
}
}, 2, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//用样式标记文本(斜体)
spannableString.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 5, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//用下划线标记文本
spannableString.setSpan(new UnderlineSpan(), 7, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//获取Drawable资源
Drawable d = getResources().getDrawable(R.mipmap.ic_launcher);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
//创建ImageSpan
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
//用ImageSpan替换文本
spannableString.setSpan(span, 10, 12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//变粗
spannableString.setSpan(new AbsoluteSizeSpan(20, true), 12, 14, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//变细
spannableString.setSpan(new AbsoluteSizeSpan(10, true), 14, 16, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//修改背景颜色
spannableString.setSpan(new BackgroundColorSpan(Color.GREEN), 12, 14, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tx.setMovementMethod(LinkMovementMethod.getInstance());//不加这句设置的部分文本点击事件将不触发
tx.setText(spannableString);