在Android Canvas上的字符串周围填充矩形

sulc1iza  于 2023-09-29  发布在  Android
关注(0)|答案(3)|浏览(118)

所以我使用Canvas.drawTextCanvas上绘制一些字符串。问题是我想在它之前画一个矩形,这样文本就会出现在矩形的中心。但我遇到了一个真实的的问题。为drawText提供的xy坐标实际上并不在真实的文本的“* 左上角 *”,而是在字符开始的行上。有一个方法Paint.getTextBounds,它返回一个矩形,该矩形在将要绘制的文本的 (0,0) 处“具有隐含的原点”。问题是原点在 (0,0)。这个盒子的宽度和高度是正确的,但是我不知道如何将它的左上角放在画布上画的字符串的左上角。我想我应该使用Fontaine,但是由于很多Fontaine返回的值都是未记录的,我真的不知道如何使用它们来实现我的目的。

q1qsirdb

q1qsirdb1#

我最终做

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)**的矩形

brgchamk

brgchamk2#

尝试使用绘制矩形
canvas.drawRect(x, y - Paint.GetTextSize(), x + Paint.measureText("text"), y, Paint);

8i9zcol2

8i9zcol23#

文本周围的矩形
th是矩形和文本之间差距
textStart -文本的起始点(PointF)

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)

相关问题