自定义 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() 值。
我正在尝试创建一个扩展 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() 值。