前言
本文记录一下SpannableStringBuilder的使用,同时也介绍一下SpannableString
记录于此,方便自己查阅。
PS: 本文摘抄和整理
正文
SpannableString,SpannableStringBuilder和String从字面看就是他们存在一定的关系。就如String、StringBuilder和StringBuffer一样。
区别
SpannableString像一个String一样,传入一个String之后再无法更改String的内容,也无法拼接多个SpannableString;而 SpannableStringBuilder则更像是StringBuilder,它可以通过其append() 方法来拼接多个String。
作用
SpannableString、SpannableStringBuilder基本上与String差不多,也是用来存储字符串。但它们有一个SetSpan() 方法,可以设置各种样式,比如设置部分字体颜色、大小、下划线、将文字替换为图片等。
使用
效果如下
改变指定位置的字的颜色
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
spannableStringBuilder.append("一二五啦·读书导航-阅读是一种生活方式。");
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.BLUE);
spannableStringBuilder.setSpan(foregroundColorSpan, 0, 4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
mTvMessage.setText(spannableStringBuilder);
改变指定位置的字体大小
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
spannableStringBuilder.append("一二五啦·读书导航-阅读是一种生活方式。");
AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(16);
spannableStringBuilder.setSpan(absoluteSizeSpan, 0, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
mTvMessage.setText(spannableStringBuilder);
改变指定位置的背景颜色
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
spannableStringBuilder.append("一二五啦·读书导航-阅读是一种生活方式。");
BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.BLUE);
spannableStringBuilder.setSpan(backgroundColorSpan, 0, 4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
mTvMessage.setText(spannableStringBuilder);
改变指定位置的字体样式
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
spannableStringBuilder.append("一二五啦·读书导航-阅读是一种生活方式。");
StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);//粗体
spannableStringBuilder.setSpan(styleSpan, 0, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
styleSpan = new StyleSpan(Typeface.ITALIC);//斜体
spannableStringBuilder.setSpan(styleSpan, 10, 12, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
styleSpan = new StyleSpan(Typeface.BOLD_ITALIC);//粗斜体
spannableStringBuilder.setSpan(styleSpan, 13, spannableStringBuilder.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
mTvMessage.setText(spannableStringBuilder);
改变指定位置添加下划线和删除线
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
spannableStringBuilder.append("一二五啦·读书导航-阅读是一种生活方式。");
//删除线
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
spannableStringBuilder.setSpan(strikethroughSpan, 0, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
//下划线
UnderlineSpan underlineSpan = new UnderlineSpan();
spannableStringBuilder.setSpan(underlineSpan, 10, spannableStringBuilder.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
mTvMessage.setText(spannableStringBuilder);
改变指定位置替换为图片
final float scale = getResources().getDisplayMetrics().density;
//由25dp转化来的px
int px = (int) (25 * scale + 0.5f);
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
spannableStringBuilder.append("一二五啦·读书导航-阅读是一种生活方式。");
//添加图片
Drawable drawable = getResources().getDrawable(R.mipmap.smil);
drawable.setBounds(0, 0, px, px);
ImageSpan imageSpan1 = new ImageSpan(drawable);
spannableStringBuilder.setSpan(imageSpan1, spannableStringBuilder.length() - 1, spannableStringBuilder.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
mTvMessage.setText(spannableStringBuilder);
改变指定位置点击颜色变化
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
spannableStringBuilder.append("一二五啦·读书导航-阅读是一种生活方式。");
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
//设置颜色和去掉下划线
ds.setColor(Color.YELLOW);
ds.setUnderlineText(false);
}
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "一二五啦", Toast.LENGTH_SHORT).show();
}
};
spannableStringBuilder.setSpan(clickableSpan, 0, 4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
//设置点击后的颜色为透明,否则会一直出现高亮
mTvMessage.setHighlightColor(Color.TRANSPARENT);
mTvMessage.setText(spannableStringBuilder);
//触发点击事件
mTvMessage.setMovementMethod(LinkMovementMethod.getInstance());
mTvMessage.setText(spannableStringBuilder);
参考文章
暂无评论...
随机推荐
[摘]Android面试题目整合
Java相关容器(HashMap、HashSet、LinkedList、ArrayList、数组等)内存模型垃圾回收算法(JVM)垃圾回收机制和调用System.gc()的区别?类加载过程(需要多看看,重在理解,对于热修复和插件化比较重要)反射多线程和线程池设计模式(六大基本原则、...
媒体封面流RecyclerCoverFlow左右滚动
前言本文没有创新,使用其他大佬代码进行定制化的,参考文章请看文末。主要是删减了部分功能和增加了无限循环等。记录于此,方便自己翻阅。正文效果如图隐藏内容!付费阅读后才能查看!¥6多个隐藏块只需支付一次付费阅读参考文章《GitHub - ChenLittlePing/Recycler...
王小波:肚子里的战争
我年轻时,有一回得了病,住进了医院。当时医院里没有大夫,都是工农兵出身的卫生员——真正的大夫全都下到各队去接受贫下中农再教育去了。话虽如此说,穿着白大褂的,不叫他大夫又能叫什么呢。我入院第一天,大夫来查房,看过我的化验单,又拿听诊器把我上下听了一遍,最后还是开口来问:你得了什么病。原来那张化验单他没...
JNI之函数介绍四之数组操作
前言今天介绍一下JNI中数组相关操作函数。正文GetArrayLength # env: JNI 接口指针# array: Java 数组对象jsize GetArrayLength(JNIEnv *env, jarray array);返回数组中的元素数(数组的长度)。NewOb...
席慕容 :盼望
其实,我盼望的,也不过就只是那一瞬。我从没要求过你给我,你的一生。如果能在开满了栀子花的山坡上与你相遇,如果能深深地爱过一次再别离,那么,再长久的一生,不也就只是,就只是,回首时,那短短的一瞬。
梁文道:专心吃饭
我曾经在别处介绍过一个我最喜欢的书痴故事,关于匈牙利革命时期的一位贵族,他嗜书如狂到了一个程度,即使是在被推上断头台之际,仍然不忘用笔在书上划线做笔记。假如一个人爱书爱到了连死之将至也不为所动的地步,那书痴这个称号他就实在是当之无愧了。我再和大家介绍一位真正的美食家。他是一位二十世纪的日本大禅师,...