【发布时间】: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