在 Android Canvas 上围绕字符串放置一个矩形

问题描述 投票:0回答:3

所以我使用 Canvas.drawTextCanvas 上绘制一些字符串。问题是我想在它之前画一个矩形,以便文本显示在矩形的中心。但我遇到了一个真正的问题。为 drawText 提供的 xy 坐标实际上不是真实文本的“左上角”角,而是位于字符开始的行上。有一个方法 Paint.getTextBounds 可以在要绘制的文本的 (0,0) 处返回一个“隐含原点”的矩形。问题是原点位于 (0,0)。该框的宽度和高度是正确的,但我不知道如何将其左上角放置在画布上绘制的字符串的左上角。我想我应该使用 FontMetrics,但由于很多值 FontMetrics 返回没有记录,我不太确定如何将它们用于我的目的。

java android graphics android-canvas
3个回答
13
投票

我最终做了

FontMetrics fm = new FontMetrics();
paint.setTextAlign(Paint.Align.CENTER);
paint.getFontMetrics(fm);
canvas.drawText(text, x, y + -(fm.ascent + fm.descent) / 2, paint);

实际上以 xy 为中心绘制文本。在此之前,我绘制一个以 xy 为中心、宽度为 paint.measureText(text)

的矩形

3
投票

尝试使用

绘制矩形

canvas.drawRect(x, y - Paint.GetTextSize(), x + Paint.measureText("text"), y, Paint);


0
投票

文字周围的矩形

th 是矩形和文本之间的间隙

    val textRect = Rect().also {
        paint.getTextBounds(text, 0, text.length, it)
        it.offsetTo(
        when(paint.textAlign){
            Paint.Align.RIGHT -> {
                (textStart.x - it.width()).toInt()
            }
            
            Paint.Align.CENTER -> {
               (textStart.x - it.width()/2f).toInt()
            }
            else -> {
               textStart.x.toInt()
           }
    }, textStart.y.toInt() - it.height())
    }.toRectF().also{it.inset(-th, -th)}
  canvas.drawRect(textRect, paint)
© www.soinside.com 2019 - 2024. All rights reserved.