【问题标题】:Kerning problems when drawing text character by character逐字符绘制文本时的字距问题
【发布时间】:2011-01-03 06:45:48
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java string graphics2d kerning


    【解决方案1】:

    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++;
    }
    

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

    【讨论】:

      【解决方案2】:

      问题是紧缩定义了个字母的间距,并且逐个字符地迭代字符串使紧缩系统没有机会启动。我认为您必须使用固定宽度的字体或修改您的灯光效果,使其适用于完整的字符串而不是单个字符。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-06
          • 1970-01-01
          • 2014-01-29
          • 1970-01-01
          • 2012-09-13
          • 1970-01-01
          相关资源
          最近更新 更多