图形字符串的起源在哪里开始?

时间:2012-02-06 23:17:38

标签: java swing graphics awt java-2d

在Java核心书中,它说

  

getStringBounds方法返回的矩形的宽度是水平的   字符串的范围。矩形的高度是上升,下降和的总和   领导。矩形的原点位于字符串的基线。矩形的顶部y坐标是负的。因此,您可以获得字符串宽度,高度和   上升如下:

double stringWidth = bounds.getWidth();
double stringHeight = bounds.getHeight();
double ascent = -bounds.getY();

当说矩形的原点位于字符串的基线时,作者的意思是什么,而顶部的y坐标是上升?

字符串的边界矩形从哪里开始?

使用测试字符串我得到以下内容:

w: 291.0
h: 91.265625
x:0.0
y:-72.38671875
descent: 15.8203125
leading: 3.0585938

这意味着矩形原点位于前导而不是基线,我对此是否正确?

3 个答案:

答案 0 :(得分:5)

这意味着边界的坐标位于零Y坐标位于字符串基线且正Y坐标向下的空间中。在下图中,黑点对应于零Y:

font metrics

因此,负bounds.getY()(上升)对应于最顶部的坐标。正bounds.getHeight() + bounds.getY()(下降+前导)将对应于此坐标空间中的最低坐标。

答案 1 :(得分:4)

数学计算出来了:

72.38671875上升+ 15.8203125下降+ 3.0585938领先= 91.265625总高度

This tutorial on 2D Text有一张图片说明了领先,下降和上升。

在您的具体情况下,72.38671875是上升的高度。这是从基线到最高雕文顶部的测量值。前导是下行器底部到下一行顶部之间的空间。

边界矩形相对于基线。 FontMetrics.getStringBounds的API指出“返回的边界是基线相对坐标”,它解释了您的结果。 x将始终为0,并且边界框的高度将是上升加上下降加上前导。

答案 2 :(得分:3)

Java图形坐标系的原点位于画布的右上角,Y坐标从上到下增加 。这意味着矩形的上边缘(getY()的返回值)将具有小于 Y坐标而不是其下边缘(文本字符串的基线)。

getStringBounds()的结果值与此略有一致。在遵循坐标系的同时,边界矩形的原点相对于基线,而不是左上角。这意味着矩形的左上角将具有负Y坐标。