SpannableStringBuilder的简单使用

Android  小知识  2023年2月3日 pm6:32发布2年前 (2023)更新 城堡大人
123 0 0

前言

本文记录一下SpannableStringBuilder的使用,同时也介绍一下SpannableString

记录于此,方便自己查阅。

PS: 本文摘抄和整理

正文

SpannableString,SpannableStringBuilder和String从字面看就是他们存在一定的关系。就如String、StringBuilder和StringBuffer一样。

区别

SpannableString像一个String一样,传入一个String之后再无法更改String的内容,也无法拼接多个SpannableString;而 SpannableStringBuilder则更像是StringBuilder,它可以通过其append() 方法来拼接多个String。

作用

SpannableString、SpannableStringBuilder基本上与String差不多,也是用来存储字符串。但它们有一个SetSpan() 方法,可以设置各种样式,比如设置部分字体颜色、大小、下划线、将文字替换为图片等。

使用

效果如下

SpannableStringBuilder的简单使用

改变指定位置的字的颜色
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);

参考文章

  1. SpannableStringBuilder从简单到复杂的使用
  2. SpannableString的用法详解

版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

[摘]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...

席慕容 :盼望

其实,我盼望的,也不过就只是那一瞬。我从没要求过你给我,你的一生。如果能在开满了栀子花的山坡上与你相遇,如果能深深地爱过一次再别离,那么,再长久的一生,不也就只是,就只是,回首时,那短短的一瞬。

梁文道:专心吃饭

我曾经在别处介绍过一个我最喜欢的书痴故事,关于匈牙利革命时期的一位贵族,他嗜书如狂到了一个程度,即使是在被推上断头台之际,仍然不忘用笔在书上划线做笔记。假如一个人爱书爱到了连死之将至也不为所动的地步,那书痴这个称号他就实在是当之无愧了。我再和大家介绍一位真正的美食家。他是一位二十世纪的日本大禅师,...