Java: как узнать высоту кепки и x-высоту шрифта?
FontMetrics не имеет геттеров для высота крышки и x-height шрифта.
Как я могу получить эти значения?
Что касается высоты крышки, то нет гарантии для конкретной заглавной буквы, что восхождение по букве совпадает с высотой крышки. (например, капитал H не гарантированно плоский сверху)
Что касается высоты x, я предполагаю, что он, вероятно, такой же, как высота "x", но опять же нет гарантии.
изменить: Grr! Я просто попробовал FontMetrics.getBounds()
и FontMetrics.getLineMetrics()
для конкретных символьные последовательности, и я всегда получаю одинаковый ответ для высот (getBounds() действительно отличается по ширине). В методе hasUniformLineMetrics()
есть примечание о шрифтометрах с несколькими шрифтами для покрытия набора символов, но это охватывает группы символов, а не отдельные символы.
Ответы
Ответ 1
То, что вы ищете, - это окно рендеринга экрана, которое сообщает вам точный размер текста.
Это означает, что вам нужно будет предоставить информацию в какой-то момент о поверхности, на которой вы рисуете, и строке, которую вы рисуете. Причина в том, что система просто не знает визуальный результат до позднего рендеринга. Я использовал:
Graphics2D g;
g.getFont().createGlyphVector(g.getFontRenderContext(),"abc").getVisualBounds();
Вы также можете попробовать:
Graphics2D g;
g.getFont().getMaxCharBounds(g.getFontRenderContext());
У меня тоже есть проблемы с сохранением всех этих методов шрифтов.
Ответ 2
Я не работал с ним, но класс GlyphView.GlyphPainter имеет методы getAscent
, getDescent
и getHeight
. Это может быть что-то проверить.
Ответ 3
Ну, если вы пытаетесь создать коробку с текстом, который соответствует тексту, я думаю, вы можете просто сделать высоту самого размера шрифта
Я не уверен, но я думаю, что это то, что я делал в прошлом
Ответ 4
Что касается x-height, то для меня следующий код woks:
public double getXHeight(Font font)
{
FontRenderContext fc = new FontRenderContext(null, false, false);
TextLayout layout = new TextLayout("x", font, fc);
return layout.getBounds().getHeight();
}