5

文字列を文字ごとに描画して、テキストで構成される形状に照明効果を追加しようとしています。

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

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

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

問題は、文字の幅は、これらの 2 つの文字が文字列として印刷されるときに別の文字から描画される実際の距離ではないことです。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

問題は、カーニングが文字のペアの間隔を定義することであり、文字列を 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 に答える