ImageSpan 在 API 29 以下的居中问题

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容