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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容