如何准确测量通过 drawTextOnPath() 在画布上绘制的文本的像素大小

Nic*_*ick 5 java graphics android canvas

我正在使用 drawTextOnPath() 在画布上显示一些文本,我需要知道正在绘制的文本的尺寸。我知道这对于由多个线段、曲线等组成的路径是不可行的,但我的路径是完全水平的单个线段。我正在使用 Paint.getTextBounds() 获取一个具有我想要绘制的文本尺寸的矩形。

当我在任意位置绘制文本时,我使用此矩形在文本周围绘制边界框。

这是一些反映我当前正在做的事情的简化代码:

// to keep this example simple, always at origin (0,0)
public drawBoundedText(Canvas canvas, String text, Paint paint) {
    Rect textDims = new Rect();
    paint.getTextBounds(text,0, text.length(), textDims);
    float hOffset = 0;
    float vOffset = paint.getFontMetrics().descent;  // vertically centers text 
    float startX = textDims.left;  / 0
    float startY = textDims.bottom;
    float endX = textDims.right;
    float endY = textDims.bottom;

    path.moveTo(startX, startY);
    path.lineTo(endX, endY);
    path.close();

    // draw the text
    canvas.drawTextOnPath(text, path, 0, vOffset, paint);

    // draw bounding box
    canvas.drawRect(textDims, paint);
}
Run Code Online (Sandbox Code Playgroud)

结果很接近,但并不完美。如果我将倒数第二行替换为:

canvas.drawText(text, startX, startY - vOffset, paint);
Run Code Online (Sandbox Code Playgroud)

然后就可以完美运行了。通常右边缘和下边缘有 1-3 个像素的间隙。该错误似乎也随着字体大小的变化而变化。有任何想法吗?我可能做的一切都是正确的,问题出在drawTextOnPath(); 沿路径绘制时,即使路径是水平的,文本质量也会明显下降,这可能是由于插值算法或其在幕后使用的任何内容所致。如果发现尺寸抖动也来自那里,我不会感到惊讶。

Nic*_*ick 0

我找到了一个适合我的特定情况的解决方案,尽管它并没有真正解决最初的问题。

由于我的特定用例仅沿着单段直线路径绘制文本,因此我能够一起摆脱路径并使用 Canvas.drawText() 以及 Canvas.translate() 和 canvas.rotate() 。这消除了我在沿着路径绘制时看到的文本大小随机性和丑陋。