【day26】Span翻转TextView

好的,连假最後一天,我们来个小篇章,就是Span啦,Span可以做到的事情有很多,如
*更改特定位置的字体颜色/大小
*新增项目符号
*可点击
*换行等等功能

一、先设定颜色

首先先创立几个 String的变数

val str1 = "啊!多麽痛的领悟 你曾是我的全部"
val str2 = "只是我回首来时路的每一步都走的好孤独"
val str3 = "啊!多麽痛的领悟 你曾是我的全部~~"
val str4 = "只愿你挣脱情的枷锁 爱的束缚 任意追逐"
val str5 = "别再为爱受苦"

再过来建立 SpannableStringBuilder()的实例化

val span = SpannableStringBuilder()

好的,这边可以看到实例化了一个SpannableStringBuilder(),
它还有另外一个名为 SpannableString的东西。
那两个的差别是

  • SpannableStringBuilder():实例化时不用给值,可以透过 append()去新增字串
  • SpannableString():实例化时必须给值,也无法透过 append()去新增字串

接下来来设定颜色


span.append(str2)
span.setSpan(ForegroundColorSpan(Color.RED),0,str2.length,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
span.append(str3)
span.insert(0,str1)
span.append(str4)

tv.text= span
  • append(str2):透过 append新增字串,按照顺序新增
    -setSpan(ForegroundColorSpan(Color.Red),0,str2.lenght,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE):设定颜色,参数如下

1.ForgroundColorSpan(Color.Red),文字颜色

也可以透过以下方法去拿 @color的资源

ContextCompat.getColor(requireActivity(),R.color.brown

2.第二个参数填写start: 代表start的位置,也就是第一个字

3.第三个参数填写end:代表改变end的位置,效果在这个位置不会显示

4.第四个参数填写作用区域,有以下选择

我的理解是:把 EXCLUSIVE想成不包含

INCLUSIVE 想成包含
包含的意思是是否效果扩及到其他Text文本,及假设你是在str2设立效果,
那是否前後Text文本(如str1)是否也要有扩及效果

https://ithelp.ithome.com.tw/upload/images/20211011/20138017JTqZuzxTd3.png

等等会来实际看效果图
因为我们setSpan的地方是设定str2,所以请以它为基准点

val str2 = "只是我回首来时路的每一步都走的好孤独"

span.setSpan(ForegroundColorSpan(Color.RED),0,str2.length,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

SPAN_EXCLUSIVE_EXCLUSIVE:前後不含效果

https://ithelp.ithome.com.tw/upload/images/20211011/20138017MkNS4ESkC0.jpg

SPAN_EXCLUSIVE_INCLUSIVE:前面无效果,後面有

https://ithelp.ithome.com.tw/upload/images/20211011/201380178PjF2OATOX.jpg

SPAN_INCLUSIVE_INCLUSIVE:前後皆有效果

https://ithelp.ithome.com.tw/upload/images/20211011/20138017w5y3T2jdJP.jpg

回到刚刚的code


span.append(str2)
span.setSpan(ForegroundColorSpan(Color.RED),0,str2.length,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
span.append(str3)
span.insert(0,str1)
span.append(str4)

tv.text= span
  • insert(0,str1):第一个参数是插入位置,第二个参数是要插入的字串
  • 最後则是要把xml里面的textView给值

二、设定Size

val str1 = "啊!多麽痛的领悟 你曾是我的全部"

val span = SpannableString(str1)
span.setSpan(RelativeSizeSpan(1.5F),0,3,Spanned.SPAN_EXCLUSIVE_INCLUSIVE)
tv.text= span

设置大小有两个方式

  • AbsoluteSizeSpan:绝对大小

val absoluteSize = AbsoluteSizeSpan(50,true)
val span = SpannableString(str1)
span.setSpan(absoluteSize,1,3,Spanned.SPAN_INCLUSIVE_INCLUSIVE)

-AbsoluteSizeSpan(50,true):第一个参数填写 size,第二个填写boolean

true表示单位是dp,预设是false,表示单位是px

-setSpan的参数(第一个为刚刚的AbsokuteSizeSpan,第二个为start,第三个为end)

三、文字中图片

val span = SpannableString(str1)
val imageSpan = ImageSpan(requireActivity(),R.drawable.ic_people,ImageSpan.ALIGN_BASELINE)
span.setSpan(imageSpan,3,5,Spanned.SPAN_EXCLUSIVE_INCLUSIVE)

这样要注意,setSpan(imageSpan,3,5,Spanned.SPAN_EXCLUSIVE_INCLUSIVE)

里面的 start跟end,是代表要被替代的位置,所以不会显示

https://ithelp.ithome.com.tw/upload/images/20211011/201380175RyoJ75Y50.png

我的理解是:把 EXCLUSIVE想成不包含

INCLUSIVE 想成包含

包含的意思是是否效果扩及到其他Text文本,及假设你是在str2设立效果,

那是否前後Text文本(如str1)是否也要有扩及效果

好的,那今天就先这样啦,期待明天啦!


<<:  [D26] 物件侦测(7)

>>:  【Day 27】 为何要进行服务器效能监控

Day21-D3 基础图表:散点图/散布图

本篇大纲:基本散布图范例、进阶散布图范例 今天的一天一图表,我们要来画 散点图 / 散布图!散布图...

Day27-保护鲸鱼人人有责(二)

前言 昨天已经介绍了几个写 Dockerfile 时该注意的地方,但其实需要注意的地方非常非常多,所...

Gin 表单

Golang Gin 表单 今天真的有点爆炸了,几乎没时间补文章,只能抽空拿点时间来写,如果在gin...

android studio 30天学习笔记-day 7-介绍okhttp

okhttp是常用的第三方库,跟retrofit、Volley一样都能做网络连线的请求。 今天就做个...

Day 03 - 任你存S3

云端服务的一项重点服务是资料储存,今天让我们一起来瞧瞧AWS上的资料储存服务-S3。 1. 为何要用...