【问题标题】:How to -accurately- measure size in pixels of text being drawn on a canvas by drawTextOnPath()如何准确地测量通过drawTextOnPath()在画布上绘制的文本的像素大小
【发布时间】:2011-01-09 20:19:36
【问题描述】:

我正在使用 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();沿路径绘制时,即使路径是水平的,文本质量也会明显下降,这可能是因为插值算法或其在幕后使用的任何东西。发现尺寸抖动也来自那里,我不会感到惊讶。

【问题讨论】:

  • 刚刚意识到将下降与 getTextBounds() 结合使用并不是一个好主意,因为下降是正在使用的 Paint 的函数,而 getTextBounds() 返回的 Rect 是实际使用的文本的函数. IE。不是所有的字符串都会有带血统的字符。无论如何,这不是我面临的问题。

标签: java android graphics canvas


【解决方案1】:

我找到了适合我的特殊情况的解决方案,尽管它并不能真正解决最初的问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2011-07-24
    • 2014-01-16
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    相关资源
    最近更新 更多