Java &引用;“缩放”;文本在约束/框内尽可能大
第一个问题:您还有400像素的宽度,需要在该约束范围内尽可能大地容纳一些文本(因此,文本将使用该数量的空间) 加入一个新的约束:如果文本只是“a”,那么它不能将其缩放到100像素以上的高度(或某些特定的字体大小) 最后一种情况是换行。以尽可能大的方式在400 x 150像素范围内匹配某些文本 一个明显的方法是从点1开始,然后增加,直到你不能再适应它。这将解决所有三个问题,但将是非常粗糙的。在边界内拟合一条直线可以通过以下方式完成:使用固定的点大小写入它,检查文本的结果像素边界,然后简单地使用变换缩放它(文本也可以适当缩放,然后签出)Java &引用;“缩放”;文本在约束/框内尽可能大,java,swing,java-2d,Java,Swing,Java 2d,第一个问题:您还有400像素的宽度,需要在该约束范围内尽可能大地容纳一些文本(因此,文本将使用该数量的空间) 加入一个新的约束:如果文本只是“a”,那么它不能将其缩放到100像素以上的高度(或某些特定的字体大小) 最后一种情况是换行。以尽可能大的方式在400 x 150像素范围内匹配某些文本 一个明显的方法是从点1开始,然后增加,直到你不能再适应它。这将解决所有三个问题,但将是非常粗糙的。在边界内拟合一条直线可以通过以下方式完成:使用固定的点大小写入它,检查文本的结果像素边界,然后简单地使用变换
如果您有任何其他方法来解决此问题,我们将不胜感激 我将执行以下操作: 假设您想要
W
像素宽的文本
选择任意大小,例如10pt
,然后查看文本字符串对于该大小的边界框。假设它有N
像素宽
将新大小设置为10pt*W/N
,并从第一步开始重复,直到达到合理的阈值。(希望它能在一次迭代中工作。)
这取决于字符串的宽度大致与字体大小成正比的事实。由于建模是复杂的,尤其是换行符,那么您尝试所有大小的最初建议是沿着正确的线条进行的,特别是在需要精确的情况下 但是,您可以使用二进制搜索来查找适当的字体大小,而不是测试每个值。你知道大小在1到100之间(你的上限)。使用二进制搜索,每个测试设置字体大小并检查结果布局。如果文本太大,则搜索当前可能值范围的下半部分。如果字体大小合适,则搜索上半部分。您的搜索将使用最多7次尝试(100个对数基数2向上取整),它将是准确的,无需重复即可找到最大的大小,并且如果您以后需要添加更多要求,例如字体混合或布局上更严格的限制,它将是灵活的 我假设您使用的是一个进行换行的文本组件,并且可以将最大宽度设置为400。因此,您可以设置字体大小,然后它进行布局,返回所需的高度,在给定的宽度内布局文本 您可以使用提示来尝试更快地引导算法得出结果,例如使您的第一个猜测接近预期大小,但文本呈现速度很快,因此性能的提高可能不值得实现
请参阅维基百科-我将以所需的最大尺寸实例化:例如72 dpi的一英寸图示符为72。使用(直接)或(屏幕外)获取边界和比例,同时保留纵横比。也可以提供适当的帮助。这就是我要做的。不过,对于最小和最大尺寸,我会做出合理的猜测。选择字体大小,获取字符串的高度和宽度,并按boxheight/stringheight和boxwidth/stringwidth的最小值进行缩放。四舍五入,这是您的最小字体大小(即,您知道它适合您)。最大尺寸的类似计算。我认为这是不必要的复杂。请记住,文本的宽度/高度与字体大小成线性比例。您确定这样看起来不错吗?通常情况下,最好选择一种看起来不错的字体样式/大小,并与之配套。好吧,关键是在照片的顶部画一个标题。所以,是的,我会使用一个合适的字体大小,看起来很适合一些单词的“普通”标题。然而,考虑到我们在这里谈论的是那些该死的用户,他们可能会以一种更大的方式推出更大的标题。在某种合理合理的限制下,我更愿意缩小字体大小,而不是立即用“…”有趣的见解来裁剪它!但它不考虑换行!当然,你也可以垂直做?谢谢你的主意!然而,这与我也建议的几乎相同,只是方向相反。而且它不考虑换行。事实上,我认为缩放不需要“更多渲染提示”,因为仿射变换显然可以直接处理字体大小,因此实际绘制字体时会考虑到这一点(因此,如果在绘制之前将仿射变换推入图形对象,则可以让10点图示符填充整个屏幕,而不会变得参差不齐).我在TransformUI链接中给出了一个惊人的例子。啊哈!我明白你的意思:
AffineTransform
平滑地缩放给定的轮廓字体,但是TextLayout
需要一个FontRenderContext
来进行度量。我(错误地)认为实例化多个大小的font
会很慢。