是的,我也遇到了同样的问题,我知道你所说的“低效”是什么意思。
我尝试了一个解决方案,通过字体大小测量字符串的单位计数:1(默认)。
例如:
String line = "This is a test";
Font font = Font.createFont(Font.TRUETYPE_FONT, new File("/var/fonts/times.ttf"));
FontRenderContext ctx = new FontRenderContext(font.getTransform(), false, false);
Rectangle2D rect = font.getStringBounds(line, ctx);
BigDecimal widthUnits = BigDecimal.valueof(rect.getWidth());
然后,您通过字体大小 1 获得行的宽度单位。如果它除以区域宽度并保留整数部分(向下舍入),您将获得水平的最大字体大小。
int maxSizeHor = BigDecimal.valueOf(width)
.divide(widthUnits, 1, BigDecimal.ROUND_DOWN)
.intValue();
但是,还不够。您还应该垂直计算最大字体大小。幸运的是,具有相同字体样式和字体大小的每一行具有相同的高度。如果有多行,您可以使用:
lines.length * each height in font size 1.
例如:
String[] lines = new String{"This is a test", "Hello World!"};
BigDecimal heightUnits = BigDecimal.valueOf(rect.getHeight())
.multiply(BigDecimal.valueOf(lines.length));
int maxSizeVer = BigDecimal.valueOf(height)
.divide(heightUnits
.multiply(BigDecimal.valueOf(lines.length)),
1,BigDecimal.ROUND_DOWN)
.intValue();
最后,比较并获取最小值作为最大字体大小:
Math.min(maxSizeHor, maxSizeVer)
但是,我遇到了另一个问题:单个字符“i”作为字体大小的输入字符串:1,您将获得宽度单位:0.0。但是,实际上,尽管它是一个非常小的值,但它不会为零。所以我将默认字体大小设置为 1000,并在每次进度后除以 1000。然后我得到非零值。