需要一种方法来缩放字体以适合矩形
我刚刚编写了一些代码来缩放字体以适合矩形(的长度)。 它从 18 宽度开始并向下迭代,直到适合为止。
这看起来效率非常低,但我找不到一种非循环的方法来做到这一点。 这条线用于可缩放的游戏网格中的标签,因此我看不到解决方案(包裹、切断和延伸超过矩形都是不可接受的)。
它实际上非常快,我正在对数百个矩形执行此操作,它的速度足以减慢触摸速度。
如果没有人想出更好的办法,我会从表中加载起始猜测(这样它比 18 更接近)并使用它——除了滞后之外,它效果很好。
public Font scaleFont(String text, Rectangle rect, Graphics g, Font pFont) {
float nextTry=18.0f;
Font font=pFont;
while(x > 4) {
font=g.getFont().deriveFont(nextTry);
FontMetrics fm=g.getFontMetrics(font);
int width=fm.stringWidth(text);
if(width <= rect.width)
return font;
nextTry*=.9;
}
return font;
}
I just wrote some code to scale a font to fit within (the length of) a rectangle. It starts at 18 width and iterates down until it fits.
This seems horribly inefficient, but I can't find a non-looping way to do it.
This line is for labels in a game grid that scales, so I can't see a work-around solution (wrapping, cutting off and extending past the rectangle are all unacceptable).
It's actually pretty quick, I'm doing this for hundreds of rectangles and it's fast enough to just slow it down a touch.
If nobody comes up with anything better, I'll just load the starting guess from a table (so that it's much closer than 18) and use this--except for the lag it works great.
public Font scaleFont(String text, Rectangle rect, Graphics g, Font pFont) {
float nextTry=18.0f;
Font font=pFont;
while(x > 4) {
font=g.getFont().deriveFont(nextTry);
FontMetrics fm=g.getFontMetrics(font);
int width=fm.stringWidth(text);
if(width <= rect.width)
return font;
nextTry*=.9;
}
return font;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
半伪代码:
迭代的推导:
假设您想要向具有矩形边界
r
的组件添加标签,以便标签完全填充组件的区域。 人们可以这样写:Semi-pseudo code:
A derivation that iterates:
Imagine you want to add a label to a component that has rectangular bounds
r
such that the label completely fills the component's area. One could write:将所有宽度变量更改为 float 而不是 int 以获得更好的结果。
Change all width variables to float instead of int for better result.
您可以使用插值搜索:
You could use interpolation search:
您可以使用二分搜索模式(高/低)和一定粒度(1、0.5 或 0.25 点)来提高效率。
例如,猜18,太高了吗? 移动到9,太低了吗? 13.5,太低了? 15.75,太高了? 14!
You can improve the efficiency using a binary search pattern - high/low with some granularity - either 1, 0.5 or 0.25 points.
For example, guess at 18, too high? Move to 9, too Low? 13.5, too low? 15.75, too high? 14!
一种不同的、明显的方法是在位图上预先绘制文本,然后缩小位图以适合矩形; 但是,由于手工制作的字体设计和提示等,找到正确的字体大小会产生最好看的(尽管可能不是最快的)结果。
A different, obvious way would be to have the text pre-drawn on a bitmap, and then shrink the bitmap to fit the rectangle; but, because of hand-crafted font design and hinting etc., finding the right font size produces the best-looking (although perhaps not the quickest) result.