逐字符绘制文本时的字符串问题

时间:2011-01-03 06:45:49

标签: java string graphics2d kerning

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

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

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

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

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

3 个答案:

答案 0 :(得分: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++;
}

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

答案 1 :(得分:0)

我不确定我是否正确理解了你的问题。但是,我已经测试了你的代码,实际上一些字符串字符相互重叠。

问题在于你增加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行以增加字符之间的空间。

答案 2 :(得分:0)

问题是字距调整定义了字母的间距,并且迭代字符串char-by-char使得字距调整系统无法启动。我认为你必须使用固定宽度的字体或重新设计你的灯光效果,这样它就可以使用完整的字符串而不是单个字符。