安卓:用一个TextView控件实现不同的文字效果与SpannableString:

这篇博客介绍了如何在安卓开发中利用TextView和SpannableString创建丰富的文字效果。通过SpannableString的setSpan方法,可以设置字符串的样式,如颜色、上标、下划线、删除线、字体大小、超链接等,并能实现文字与图片的结合,以及文字的倾斜和加粗效果。博客详细解释了setSpan方法的参数含义,并展示了多种功能的实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:

SpannableString的简介:

SpannableString其实和String一样,都是一种字符串类型,SpannableString可以直接作为TextView的显示文本,
不同的是SpannableString可以通过使用其方法setSpan方法实现字符串各种形式风格的显示,重要的是可以指定设置的区间,也就是为字符串指定下标区间内的子字符串设置格式。

setSpan(Object what, int start, int end, int flags)方法需要用户输入四个参数,
1.what表示设置的格式是什么,可以是前景色、背景色也可以是可点击的文本等等,
2.start表示需要设置格式的子字符串的起始下标,
3.同理end表示终了下标
4.flags属性就有意思了,共有四种属性:
Spanned.SPAN_INCLUSIVE_EXCLUSIVE 从起始下标到终了下标,包括起始下标
Spanned.SPAN_INCLUSIVE_INCLUSIVE 从起始下标到终了下标,同时包括起始下标和终了下标
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 从起始下标到终了下标,但都不包括起始下标和终了下标
Spanned.SPAN_EXCLUSIVE_INCLUSIVE 从起始下标到终了下标,包括终了下标

SpannableString的setSpan()方法可以同时使用多个,实现多种效果叠加

效果:

在这里插入图片描述

功能:

  1. 变颜色
  2. 上标
  3. 可点击
  4. X轴变化
  5. 模糊效果
  6. 删除线
  7. 下划线效果
  8. 文本字体绝对的大小
  9. 文字与图片结合
  10. 倾斜与加粗
  11. 文字字体
  12. 超文本链接
  13. 下标

实现 :

实现于TextView:

//变颜色
val spannableString1 = SpannableString("优快云风尘:https://blog.youkuaiyun.com/feng___chen")
spannableString1.setSpan(ForegroundColorSpan(Color.BLUE),1,7,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
spannableString1.setSpan(BackgroundColorSpan((Color.GRAY)),0,spannableString1.length,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
main_text1.text=spannableString1

//上标
val spannableString2 = SpannableString("优快云风尘:https://blog.youkuaiyun.com/feng___chen")
spannableString2.setSpan(SuperscriptSpan(), 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
main_text2.setText(spannableString2)

//可点击
val spannableString3 = SpannableString("优快云风尘:https://blog.youkuaiyun.com/feng___chen")
val clickableSpan = object : ClickableSpan() {
    override fun onClick(widget: View) {

    }
    override fun updateDrawState(ds: TextPaint) {
        //去掉可点击文字的下划线
        ds.isUnderlineText = false
    }
}
//文本可点击,有点击事件
spannableString3.setSpan(clickableSpan, 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
// 设置此方法后,点击事件才能生效
main_text3.setMovementMethod(LinkMovementMethod.getInstance())
main_text3.setText(spannableString3)

//X轴变化
val spannableString4 = SpannableString("优快云风尘:https://blog.youkuaiyun.com/feng___chen")
spannableString4.setSpan(ScaleXSpan(6.0f), 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
main_text4.setText(spannableString4)


//模糊效果
val spannableString5 = SpannableString("优快云风尘:https://blog.youkuaiyun.com/feng___chen")
//BlurMaskFilter模糊
var filter:MaskFilter = BlurMaskFilter(4.0f,BlurMaskFilter.Blur.OUTER);
var maskFilterSpan: MaskFilterSpan = MaskFilterSpan(filter);
spannableString5.setSpan(maskFilterSpan,0,4,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
main_text5.setText(spannableString5);

//删除线
val spannableString6 = SpannableString("优快云风尘:https://blog.youkuaiyun.com/feng___chen")
spannableString6.setSpan(StrikethroughSpan(), 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
main_text6.setText(spannableString6)

//下划线效果
val spannableString7 = SpannableString("优快云风尘:https://blog.youkuaiyun.com/feng___chen")
spannableString7.setSpan(UnderlineSpan(), 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
main_text7.setText(spannableString7)

//文本字体绝对的大小
val spannableString8 = SpannableString("优快云风尘:https://blog.youkuaiyun.com/feng___chen")
spannableString8.setSpan(AbsoluteSizeSpan(30, true), 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
main_text8.setText(spannableString8)

//文字与图片结合
val spannableString9 = SpannableString("优快云风尘:https://blog.youkuaiyun.com/feng___chen")
spannableString9.setSpan( object : DynamicDrawableSpan() {
    override fun getDrawable(): Drawable {
        val drawable = resources.getDrawable(R.mipmap.ic_launcher)
        drawable.setBounds(0, 0, 50, 50)
        return drawable
    }
}, 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
main_text9.setText(spannableString9)

//倾斜与加粗
val spannableString10 = SpannableString("优快云风尘:https://blog.youkuaiyun.com/feng___chen")
spannableString10.setSpan( StyleSpan(Typeface.BOLD_ITALIC), 0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
main_text10.setText(spannableString10)



//文字字体
val spannableString11 = SpannableString("优快云风尘:https://blog.youkuaiyun.com/feng___chen")
spannableString11.setSpan( TypefaceSpan("Arial"), 0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
main_text11.setText(spannableString11)

//超文本链接
val spannableString12 = SpannableString("优快云风尘:https://blog.youkuaiyun.com/feng___chen")
spannableString12.setSpan(URLSpan("https://blog.youkuaiyun.com/feng___chen"), 7, spannableString12.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
main_text12.setMovementMethod(LinkMovementMethod())
main_text12.setText(spannableString12)

//下标
val spannableString13 = SpannableString("优快云风尘:https://blog.youkuaiyun.com/feng___chen")
spannableString13.setSpan(SubscriptSpan(), 4, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
main_text13.setText(spannableString13)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值