“缩放”文本在约束/框内尽可能大

时间:2010-05-14 20:30:10

标签: java swing java-2d

第一个问题:你要继续使用400像素的宽度,并且需要在该约束中尽可能大地放置一些文本(因此,文本应使用该空间量)。

抛出一个新约束:如果文本只是“A”,那么它不应该超过100像素高度(或某些特定字体大小)。

然后,最后一种情况:Linebreaks。在例如最大可能的方式中拟合一些文本。 400 x 150像素。

一个显而易见的方法是简单地从第1点开始,然后再增加直到你不再适合它。这对所有三个问题都有效,但是非常粗糙。边界内单条线的拟合可以通过用一些固定点大小写入来完成,检查文本的结果像素范围,然后简单地用变换进行缩放(文本也适当缩放,检查{{3 }})。

非常感谢任何其他攻击方式的想法!

3 个答案:

答案 0 :(得分:3)

我会做以下事情:

假设您想要W像素宽文字。

选择一个任意大小,比如10pt,然后查看文本字符串为该大小获取的边界框。可以说它的像素宽N

将新尺寸设置为10pt * W/N,并从第1步开始重复,直到达到合理的阈值。 (希望它可以在一次迭代中工作。)

这取决于字符串宽度与字体大小成正比的事实。

答案 1 :(得分:3)

由于你的建模很复杂,尤其是换行符,所以你尝试所有尺寸的初步建议都是正确的,特别是如果它需要准确的话。

但是,您可以使用二进制搜索来查找合适的字体大小,而不是测试每个值。你知道大小在1到100之间(你的上限)。使用二进制搜索,每个测试设置字体大小并检查生成的布局。如果文本太大,那么我们搜索当前可能值范围的下半部分。如果字体大小适合,那么我们搜索上半部分。您的搜索将最多使用7次尝试(100个基数2向上舍入),它将是精确的,找到最大的大小而不会过去,如果您需要稍后添加更多要求,例如混合字体,它将是灵活的或更严格的布局限制。

我假设你正在使用一个文本组件来进行换行,并且你可以将最大宽度设置为400.所以,你设置了字体大小,然后它就会让你回到所需的高度,布局给定宽度内的文字。

您可以使用提示尝试更快地引导算法到结果,例如使您的第一次猜测接近预期大小,但文本呈现速度快,性能提升可能不值得实施。

参见维基百科 - Binary Search Algorithm

答案 2 :(得分:3)

我将Font实例化为所需的最大尺寸:对于72 dpi的一英寸字形,请说72。使用TextLayout使用AffineTransform(直接)或AffineTransformOp(屏幕外)获取边界和比例,同时保留纵横比。也适用RenderingHints帮助。