記一次 ImageSpan 在 API 29 以下的居中問題
描述
不多解釋,看下圖:
image
分析
既然在 API 29 上能使用 ImageSpan.ALIGN_CENTER,那我們去看看源碼的實現,將必要代碼拉出來,自己寫一個 ImageSpanUnderQ 類在 29以下使用不就完事了?
源碼分析:
image
紅色框框部分使我們的重點代碼,簡單流程就是首先拿到當前的 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