4

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

引入一个新的约束:如果文本只是“A”,那么它不应将其缩放到 100 像素高度(或某些特定字体大小)以上。

然后,最后一种情况:换行符。在例如 400 x 150 像素内以尽可能大的方式调整一些文本。

一个明显的方法是简单地从第 1 点开始,然后增加直到你不能再适应它。这将适用于所有三个问题,但会非常粗糙。可以通过使用一些固定点大小编写单行来完成边界内的单行拟合,检查文本的结果像素边界,然后简单地使用变换对其进行缩放(然后文本也正确缩放,请查看TransformUI)。

任何其他攻击方法的想法将不胜感激!

4

3 回答 3

3

我会做以下事情:

假设您想要W像素宽的文本。

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

将新大小设置为10pt * W/N,然后从第一步开始重复,直到达到合理的阈值。(希望它会在一次迭代中起作用。)

这依赖于字符串的宽度大致与字体大小成比例的事实。

于 2010-05-14T20:33:51.510 回答
3

由于您正在建模的内容很复杂,尤其是换行符,因此您最初尝试所有尺寸的建议都是正确的,特别是如果它需要准确的话。

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

我假设您正在使用一个进行换行的文本组件,并且您可以将最大宽度设置为 400。因此,您设置字体大小并执行布局,为您提供所需的高度,在给定宽度。

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

参见 Wikipedia -二分搜索算法

于 2010-05-14T20:53:50.063 回答
3

我会Font以最大的期望尺寸实例化:比如 72 代表 72 dpi 的一英寸字形。用于使用(直接)或(离屏)TextLayout获取边界和缩放,同时保留纵横比。也有合适的帮助。AffineTransformAffineTransformOpRenderingHints

于 2010-05-14T23:52:58.623 回答