记一次 ImageSpan 在 API 29 以下的居中问题

记一次 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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享