android kotlin 文字居中

本文介绍了一种在Android自定义控件中实现文字居中的方法,通过使用Paint对象的getTextBounds()和getFontMetrics()方法,分别实现了静态文字的绝对居中和动态文字的基线居中。提供了具体的代码示例,展示了如何在自定义View中应用这些技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android自动义控件的文字居中可以根据其绘制文字的绝对边界和绘制时的基线来计算偏移的值

代码:

package com.example.opencvapplication

import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.view.View
import androidx.core.graphics.setBlendMode

class MyTextView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {
    val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
        strokeWidth = 10f.dp
        strokeCap = Paint.Cap.ROUND
        style = Paint.Style.STROKE
    }

    val txt = "90%"

    val txtRect = Rect()
    var metrics = Paint.FontMetrics()

    val txtPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
        textSize = 50f.dp
        color = Color.RED
        textAlign = Paint.Align.CENTER
    }

    val rectF = RectF()

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        rectF.left = 0f + paint.strokeWidth / 2
        rectF.right = w.toFloat() - paint.strokeWidth / 2
        rectF.top = 0f + paint.strokeWidth / 2
        rectF.bottom = h.toFloat() - paint.strokeWidth / 2
    }

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        paint.color = Color.LTGRAY
        //画圆
        canvas?.drawOval(rectF, paint)
        paint.color = Color.GREEN
        //画弧线
        canvas?.drawArc(rectF, -90f, 150f, false, paint)
        //没加居中
        canvas?.drawText(txt, width / 2f, height / 2f, txtPaint)
        //textBounds方式居中 (静态文字的绝对的居中)
        txtPaint.getTextBounds(txt, 0, txt.length, txtRect)
        canvas?.drawText(
            txt,
            width / 2f,
            height / 2f + (txtRect.bottom - txtRect.top) / 2,
            txtPaint
        )
        //Metrics方式居中 (以基线的形式  适用动态文字)
        txtPaint.getFontMetrics(metrics)
        canvas?.drawText(
            txt,
            width / 2f,
            height / 2f + (metrics.descent - metrics.ascent) / 2,
            txtPaint
        )

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值