我正在使用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();沿着路径绘制时,文本质量非常明显地降低,即使路径是水平的,可能是因为插值算法或其在幕后使用的任何内容。我不会惊讶地发现尺寸抖动也来自那里。
答案 0 :(得分:0)
我找到了适合我特定情况的解决方案,虽然它并没有真正解决原始问题。
由于我的特定用例仅沿单段直线路径绘制文本,因此我能够将所有路径一起删除,并使用Canvas.drawText()以及Canvas.translate()和canvas.rotate()。这样摆脱了沿路径绘制时我看到的文本大小随机性和丑陋。