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的使用)