自定义ReplacementSpan实现圆形BackgroundColorSpan(Kotlin版本)

项目需要实现如下UI.通过自定义ReplacementSpan实现.

图片.png
class RoundBackgroundColorSpan(
        context: Context,
        bgColorResId: Int,
        textColorResId: Int)
    : ReplacementSpan() {

    private var mBgColor: Int = ContextCompat.getColor(context, bgColorResId)
    private var mTextColor: Int = ContextCompat.getColor(context, textColorResId)

    override fun getSize(paint: Paint, text: CharSequence?, start: Int, end: Int, fm: Paint.FontMetricsInt?): Int {
        return paint.measureText(text, start, end).toInt();
    }

    override fun draw(canvas: Canvas, text: CharSequence?, start: Int, end: Int, x: Float, top: Int, y: Int, bottom: Int, paint: Paint) {
       //记录原始配置值~
        val originalColor = paint.color
        val originalTextSize = paint.textSize
        val originalBottom = paint.fontMetrics.bottom
        //高度~
        val height = bottom - top
        //半径~
        var radius = height / 2f - 1
        //缩放值~
        mScale = contextSize / paint.textSize
        if (mScale > 1) {
            mScale = 1f
        }

        paint.textSize = contextSize.toFloat()
        //记录文字的偏移量~
        val excursionL = paint.measureText(text, start, end) / 2f

        //计算缩放后的偏移量~
        val excursionP = (height - (paint.fontMetrics.bottom - paint.fontMetrics.top)) / 2

        paint.color = mBgColor
        //y 需要bottom
        canvas.drawCircle(x + excursionL, y + originalBottom - (height / 2), radius * mScale, paint)
        paint.color = mTextColor

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

友情链接更多精彩内容