Масштабировать строку в Java, чтобы она соответствовала прямоугольнику изнутри - PullRequest
1 голос
/ 06 марта 2012

Может ли кто-нибудь помочь мне найти способ масштабировать строку / символ в Java (Graphics2D), чтобы он точно соответствовал прямоугольнику заданного размера (чтобы он касался прямоугольника изнутри)?

Это то, что я имею до сих пор:

String s = "S"; // always a single character!
Rectangle rect = getRect(); // defines the desired size and position
AffineTransform transform = new AffineTransform();
transform.setToTranslation(rect.getX(), rect.getY());
transform.scale(rect.getWidth() / (double) fm.stringWidth(s), 
                rect.getHeight() / (double) fm.getAscent());
FontRenderContext frc = image.getFontRenderContext();
TextLayout tl = new TextLayout(s, g2d.getFont(), frc);
Shape shape = tl.getOutline(transform);
g2d.setClip(shape);
g2d.fill(shape.getBounds());

Проблема Я запустил этот код в том, что хотя строка масштабируется так, чтобы приблизительно соответствовать размеру прямоугольников, она не соответствует ей точно, т.е. он не касается границ прямоугольников изнутри (что я и хочу!).

Помогает ли использование другого шрифта? Я использую моноширинный шрифт на данный момент. Или мне нужно сделать масштабирование по-другому?

Спасибо за помощь!

1 Ответ

3 голосов
/ 07 марта 2012

Я нашел способ сделать то, что хочу, и подумал, что мог бы поделиться этим:

Моя главная проблема заключалась в высоте разных символов, поэтому вместо восхождения шрифта я использовал егоМаксимальные и минимальные Y-координаты контура для расчета его высоты.См. Ниже.

String s = "S"; // always a single character!
Rectangle rect = getRect(); // defines the desired size and position
FontMetrics fm = g2d.getFontMetrics();
FontRenderContext frc = g2d.getFontRenderContext();
TextLayout tl = new TextLayout(s, g2d.getFont(), frc);
AffineTransform transform = new AffineTransform();
transform.setToTranslation(rect.getX(), rect.getY());
double scaleY = 
   rect.getHeight() / (double) (tl.getOutline(null).getBounds().getMaxY() 
                                - tl.getOutline(null).getBounds().getMinY());
transform.scale(rect.getWidth() / (double) fm.stringWidth(s), scaleY);
Shape shape = tl.getOutline(transform);
g2d.setClip(shape);
g2d.fill(shape.getBounds());

Надеюсь, это поможет кому-то с подобной проблемой!

...