Ton*_*ony 6 java fonts graphics2d fontmetrics
使用时很容易确定字体的渲染高度FontMetrics,但另一种方法呢?如何获得适合特定高度(以像素为单位)的字体?
"给我
Verdana一个从上升到下降30像素高的大小."
我如何向Java询问此问题?
仁,
我不认为有一种"直接"的方式来找到一个字体的高度; 只是间接的方式...通过循环大小,并测试每个的高度<=所需的高度.
如果你这样做一次,只需循环它们......如果你"在飞行中"这样做,那么进行二分搜索,它会更快.
干杯.基思.
我知道这是一个非常古老的问题,但有人可能仍然会发现它:
Java(以及许多其他地方)中的字体高度在"印刷点"中给出,其被定义为大约1/72英寸.
要计算某个像素高度所需的点,您应该能够使用以下内容:
double fontSize= pixelSize * Toolkit.getDefaultToolkit().getScreenResolution() / 72.0;
Run Code Online (Sandbox Code Playgroud)
我还没有对此进行过广泛的测试,但它似乎适用于我使用过的显示器.如果我找到一个不起作用的情况,我会报告回来.
对于我用过的标准系统字体,这会将大写字母(即上升)的高度设置为提供的像素大小.如果需要将ascent + descent设置为像素大小,可以使用FontMetrics更正值:
FontMetrics m= g.getFontMetrics(font); // g is your current Graphics object
double totalSize= fontSize * (m.getAscent() + m.getDescent()) / m.getAscent();
Run Code Online (Sandbox Code Playgroud)
当然,某些特定字母的实际像素高度将取决于所使用的字母和字体,因此如果您想确保"H"是一些确切的高像素数,您可能仍希望使用该试用版其他答案中提到的错误方法.请记住,如果您使用这些方法来获取要显示的每个特定文本的大小(如@Bob建议的那样),您可能会在屏幕上出现随机字体大小的混乱,其中包含"ace"等文本"会有比"标签"更大的字母.为了避免这种情况,我会选择一个特定的字母或字母序列("T"或"Tg"或其他东西)并将其固定到像素高度一次,然后使用从中到处获得的字体大小.
我不知道如何通过其实际高度(以像素为单位)获取字体.这取决于它所使用的上下文,所以可能没有比最佳匹配样本更短的方式.从设计高度向上或向下寻找尺寸应该非常快.这是一个执行此操作的示例方法:
public Font getFont(String name, int style, int height) {
int size = height;
Boolean up = null;
while (true) {
Font font = new Font(name, style, size);
int testHeight = getFontMetrics(font).getHeight();
if (testHeight < height && up != Boolean.FALSE) {
size++;
up = Boolean.TRUE;
} else if (testHeight > height && up != Boolean.TRUE) {
size--;
up = Boolean.FALSE;
} else {
return font;
}
}
}
Run Code Online (Sandbox Code Playgroud)