5

我正在尝试逐个字符地绘制字符串以向由文本组成的形状添加照明效果。

while (i != line.length()) {
c = line.substring(i, i + 1);

cWidth = g.getFontMetrics().stringWidth(c);

g.drawString(c, xx += cWidth, yy);
i++;
}

问题是,当这两个字符作为字符串打印时,一个字符的宽度并不是它与另一个字符的实际距离。有没有办法在graphics2d中获得正确的距离?

4

3 回答 3

2

Lukas Baran 的回答解决了可能导致您的输出看起来很糟糕的主要问题。但是,您无法以这种方式复制字距调整的更微妙的问题仍然存在。这有多少问题可能取决于您使用的字体。为了获得正确的字距,您可以执行以下操作:

while (i != line.length()) {
  String c = line.substring(i, i + 1);
  String d = line.substring(0, i + 1);
  int cWidth = g.getFontMetrics().stringWidth(c);
  int dWidth = g.getFontMetrics().stringWidth(d);
  g.drawString(c, xx + dWidth - cWidth, yy);
  i++;
}

这应该将每个字符放置在字距调整的位置。

于 2011-02-04T12:22:39.663 回答
1

问题是字距定义了字母的间距,并且逐个字符地迭代字符串使字距调整系统没有机会启动。我认为您必须使用固定宽度的字体或重新设计您的照明效果,因此它适用于完整的字符串而不是单个字符。

于 2011-01-23T01:52:03.130 回答
-1

我不确定我是否正确理解了您的问题。但是,我已经测试了您的代码,并且确实有些字符串字符相互重叠。

问题在于您正在增加xx值(在绘制字符之前您正在增加它)。

这是您的代码的更正版本:

public void myDrawString(Graphics g, String line, int xx, int yy) {
    int i = 0;
    while (i != line.length()) {
        String c = line.substring(i, i + 1);
        int cWidth = g.getFontMetrics().stringWidth(c);
        g.drawString(c, xx, yy);
        xx += cWidth;
        //xx += 2;
        i++;
    }
}

取消注释并调整xx += 2行以增加字符之间的空间。

于 2011-01-12T16:30:42.430 回答