0

我正在尝试创建一个扩展 ImageSpan 的自定义类,因为我需要跨度上的某种边距/填充。

我认为我需要做的是覆盖 getSize 函数以返回更大的宽度,以便跨度以图形方式隔开。

问题是,一旦我覆盖 getSize 函数,我的视图就会完全搞砸。我有根据的猜测是,我在那个函数中做了一些愚蠢的事情,但我不知道是什么。

正确显示的视图

错误的显示视图

自定义类代码:

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()
    }
}
4

1 回答 1

1

我想到了。我正在发布解决方案,所以如果有人寻找它,他可以找到它!

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

这是正确的代码:

    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

    }

也就是说,我可以想出的更简洁的空间跨度方法不是处理跨度类,而是更改 setBounds() 值。

于 2020-08-13T09:57:31.823 回答