Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;“缩放”;文本在约束/框内尽可能大_Java_Swing_Java 2d - Fatal编程技术网

Java &引用;“缩放”;文本在约束/框内尽可能大

Java &引用;“缩放”;文本在约束/框内尽可能大,java,swing,java-2d,Java,Swing,Java 2d,第一个问题:您还有400像素的宽度,需要在该约束范围内尽可能大地容纳一些文本(因此,文本将使用该数量的空间) 加入一个新的约束:如果文本只是“a”,那么它不能将其缩放到100像素以上的高度(或某些特定的字体大小) 最后一种情况是换行。以尽可能大的方式在400 x 150像素范围内匹配某些文本 一个明显的方法是从点1开始,然后增加,直到你不能再适应它。这将解决所有三个问题,但将是非常粗糙的。在边界内拟合一条直线可以通过以下方式完成:使用固定的点大小写入它,检查文本的结果像素边界,然后简单地使用变换

第一个问题:您还有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
会很慢。