美文网首页
Android Span的使用

Android Span的使用

作者: Gray_s | 来源:发表于2021-03-09 23:35 被阅读0次

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

          本文链接:https://www.haomeiwen.com/subject/jmysqltx.html