项目需要实现如下UI.通过自定义ReplacementSpan实现.
图片.pngclass 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
}
}
网友评论