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

时间:2011-01-09 20:19:36

标签: java android graphics canvas

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

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

这里有一些简化的代码反映了我目前正在做的事情:

// 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);
}

结果是 - 接近 - 但不完美。如果我将第二行替换为最后一行:

canvas.drawText(text, startX, startY - vOffset, paint);

然后它完美无缺。通常在右边缘和底边缘上有1-3个像素的间隙。错误似乎也随字体大小而变化。有任何想法吗?我可能正在做的一切正确,问题在于drawTextOnPath();沿着路径绘制时,文本质量非常明显地降低,即使路径是水平的,可能是因为插值算法或其在幕后使用的任何内容。我不会惊讶地发现尺寸抖动也来自那里。

1 个答案:

答案 0 :(得分:0)

我找到了适合我特定情况的解决方案,虽然它并没有真正解决原始问题。

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