记一次 ImageSpan 在 API 29 以下的居中问题
描述
不多解释,看下图:
分析
既然在 API 29 上能使用 ImageSpan.ALIGN_CENTER,那我们去看看源码的实现,将必要代码拉出来,自己写一个 ImageSpanUnderQ 类在 29以下使用不就完事了?
源码分析:
红色框框部分使我们的重点代码,简单流程就是首先拿到当前的 Drawable ,其次计算 Canvas 的平移距离并平移,目的是居中绘制当前图片,最后 b.draw(canvas) 绘制上去。
处理
源码如下:
class ImageSpanUnderQ(drawable: Drawable) : ImageSpan(drawable) {
private var mDrawableRef: WeakReference<Drawable>? = null
override fun draw(canvas: Canvas,
text: CharSequence?,
start: Int,
end: Int,
x: Float,
top: Int,
y: Int,
bottom: Int,
paint: Paint) {
val b: Drawable = getCachedDrawable() ?: return
canvas.save()
val transY = (bottom - top) / 2 - b.bounds.height() / 2
canvas.translate(x, transY.toFloat())
b.draw(canvas)
canvas.restore()
}
private fun getCachedDrawable(): Drawable? {
val wr: WeakReference<Drawable>? = mDrawableRef
var d: Drawable? = null
if (wr != null) {
d = wr.get()
}
if (d == null) {
d = drawable
mDrawableRef = WeakReference(d)
}
return d
}
}
总结
问题不是很难,遇见多思考并从源码中找突破口~
Guys,Peace & Love