Android 圆角 span


import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import android.text.style.ReplacementSpan
import com.banbantv.show.utils.device.DisplayUtil
import kotlin.math.abs


/**
 * @Author: qqyang
 * @Date: 2021/10/26
 * @Description: 圆角 span.
 */
class RadiusBackgroundSpan(
    /**背景颜色*/
    private val backgroundColor: Int = Color.parseColor("#00000000"),
    /**圆角半径,单位 dp*/
    private val radius: Int = 0,
    /**文字大小,单位 dp*/
    private val textSize: Int = 12,
    /**文字颜色*/
    private val textColor: Int = Color.parseColor("#ffffff"),
    /**文字水平外边距,单位 dp*/
    private val marginHorizontal: Int = 0,
    /**文字垂直外边距,单位 dp*/
    private val marginVertical: Int = 0
) : ReplacementSpan() {

    private var mSize = 0
    override fun getSize(
        paint: Paint,
        text: CharSequence?,
        start: Int,
        end: Int,
        fm: Paint.FontMetricsInt?
    ): Int {
        paint.textSize = DisplayUtil.dp2px(textSize.toFloat()).toFloat()
        mSize = paint.measureText(text, start, end)
            .toInt() + DisplayUtil.dp2px(marginHorizontal * 2.toFloat())
        return mSize
    }

    override fun draw(
        canvas: Canvas, text: CharSequence?, start: Int, end: Int, x: Float,
        top: Int, y: Int, bottom: Int, paint: Paint
    ) {
        text?.let {
            paint.isAntiAlias = true
            paint.textSize = DisplayUtil.dp2px(textSize.toFloat()).toFloat()
            val baseLineY = (bottom - top) / 2 + abs(paint.ascent() + paint.descent()) / 2

            // 绘制圆角背景.
            paint.color = backgroundColor
            val oval = RectF(
                x,
                baseLineY + paint.ascent() - DisplayUtil.dp2px(marginVertical.toFloat()),
                x + mSize,
                baseLineY + paint.descent() + DisplayUtil.dp2px(marginVertical.toFloat())
            )
            canvas.drawRoundRect(oval, radius.toFloat(), radius.toFloat(), paint)

            // 绘制文字.
            paint.color = textColor
            canvas.drawText(
                text, start, end,
                x + DisplayUtil.dp2px(marginHorizontal.toFloat()), baseLineY,
                paint
            )
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值