Android Span的使用

Android中TextView作为最常用的组件, 常常有很多特殊的需求,例如:嵌入图标、部分文字可点击,点击链接等,这些需求都可以通过Span来实现。

功能
BackgroundColorSpan 更改文本的背景颜色
ClickableSpan 可以点击的字段
ForegroundColorSpan 修改文字颜色
MaskFilterSpan 可以通过MaskFilter修改文字透明度、浮雕等
MetricAffectingSpan 修改文字的宽高等
StrikethroughSpan 文字划线
StrikethroughSpan 双击文字显示建议
UnderlineSpan 文字下划线
AbsoluteSizeSpan 修改文字大小
DynamicDrawableSpan 替换选择的字段为Drawable
ImageSpan 替换选择的字段为Drawable(DynamicDrawableSpan子类)
LocaleSpan 修改文字的地区Locale
RelativeSizeSpan 按比例缩放文字
ReplacementSpan
ScaleXSpan 水平缩放文字大小
StyleSpan 设置文字的Style
SubscriptSpan 向下移动文字基线
SuperscriptSpan 向上移动文字的基线
TextAppearanceSpan 设置文字外观
TextLinks.TextLinkSpan 可点击的文字链接
TypefaceSpan 修改文字字体
URLSpan 设置可点击url链接

上面就是系统提供的所有可用的Span类。下面就来解决上面提出的两个问题。
1.文字中添加图片
这种方式的实现主要是利用ImageSpan

        val spannableString = SpannableString("img这是一张图片")
        getDrawable(this, R.mipmap.ic_launcher)?.let {
            it.setBounds(0, 0, 100, 100)
            val dynamicDrawableSpan =
                ImageSpan(it, ImageSpan.ALIGN_BOTTOM)
            spannableString.setSpan(dynamicDrawableSpan, 0, 3 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
            val subscriptSpan = SubscriptSpan()
            spannableString.setSpan(subscriptSpan, 0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
            tv.setText(spannableString)
        }

代码中不是使用了ImageSpan,同时使用了SubscriptSpan,主要是为了,调整图片的位置,实现类似居中的效果,在实际开发中可以通过,SubscriptSpan、SuperscriptSpan,来调整图片的位置。
2、文字可点击

        val spannableString = SpannableString("你好,再见")
        val dynamicDrawableSpan =
            object : ClickableSpan() {
                override fun onClick(widget: View) {
                    Toast.makeText(widget.context, "点击你好", Toast.LENGTH_SHORT).show()
                }
            }

        spannableString.setSpan(dynamicDrawableSpan, 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        tv.text = spannableString
        tv.movementMethod = LinkMovementMethod.getInstance()

文字点击的方案就是实现ClickableSpan的onClick方法,然后设置movmentMethod就可以了,不过他会有可以点击的文字会有独特的颜色和下划线。想要修改的话只要继承ClickableSpan,然后重写updateDrawState方法就好了。

abstract class TextColorSpan(var color: Int) : ClickableSpan() {
    override fun updateDrawState(ds: TextPaint) {
        ds.color = color
    }
}

总的来说,span的使用并不复杂,只要使用系统提供的Span就可以解决大部分问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 探索 Android 中的 Span 在 Android 中,使用 Span 定义文本的样式. 通过 Span 改...
    TonnyL阅读 6,185评论 2 14
  • 系列文章之 Android中自定义View(一)系列文章之 Android中自定义View(二)系列文章之 And...
    YoungerDev阅读 4,467评论 3 11
  • 文中内容主要是介绍如何通过拖拽模式实现view界面,所以相关属性请自行打开text模式查看 本文基于https:/...
    CnPeng阅读 14,804评论 1 7
  • 最近要开发一个tv项目,就去官网看了一些资料。自己边看边整理一些个人认为对我目前有帮助的,这里主要是对官网上的一部...
    renkuo阅读 7,500评论 0 5
  • 推荐指数: 6.0 书籍主旨关键词:特权、焦点、注意力、语言联想、情景联想 观点: 1.统计学现在叫数据分析,社会...
    Jenaral阅读 5,752评论 0 5