自定义 ImageSpan 显示不正确

Custom ImageSpan not displaying properly

我正在尝试创建一个扩展 ImageSpan 的自定义 class,因为我需要某种 margin/padding 跨度。

我认为我需要做的是将 getSize 函数重写为 return 更大的宽度,以便跨度在图形上间隔开。

问题是,一旦我重写了 getSize 函数,我的视图就完全搞砸了。我有根据的猜测是我在该函数中做了一些愚蠢的事情,但我无法得到什么。

自定义class代码:

class PaddingImageSpan(drawable: Drawable, private val offset: Float = 0f) : ImageSpan(drawable) {

    override fun getSize(
        paint: Paint,
        text: CharSequence?,
        start: Int,
        end: Int,
        fm: Paint.FontMetricsInt?
    ): Int {

        val width = paint.measureText(text, start, end)
        val fontMetricsInt = paint.fontMetricsInt

        if (fm != null){
            fm.ascent = fontMetricsInt.ascent
            fm.bottom = fontMetricsInt.bottom
            fm.descent = fontMetricsInt.descent
            fm.leading = fontMetricsInt.leading
            fm.top = fontMetricsInt.top
        }

        println(width)

        return width.roundToInt()
    }
}

我明白了。我正在发布解决方案,这样如果有人寻找它,他就可以找到它!

我的问题是我使用的是文本指标而不是可绘制指标。

这是正确的代码:

    override fun getSize(
        paint: Paint,
        text: CharSequence?,
        start: Int,
        end: Int,
        fm: Paint.FontMetricsInt?
    ): Int {

        val rect = drawable.bounds

        if (fm != null) {
            fm.ascent = -rect.bottom
            fm.descent = 0

            fm.top = fm.ascent
            fm.bottom = 0
        }

        return rect.right// + offset

    }

也就是说,我想出的更简洁的方法 space spannable 不是通过处理 spannable class 而是改变 setBounds() 值。