2011-01-03 9 views
5

Ich versuche Zeichenfolgen Zeichen für Zeichen, um Lichteffekte zu Formen aus Text hinzuzufügen.Kerning Probleme beim Zeichnen von Text Zeichen für Zeichen

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

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

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

Das Problem ist, die Breite eines Zeichens nicht die tatsächliche Entfernung von einem anderen Zeichen gezeichnet ist, wenn diese beiden Zeichen als eine Zeichenfolge gedruckt werden. Gibt es eine Möglichkeit, die richtige Distanz in graphics2d zu bekommen?

Antwort

0

Ich bin mir nicht sicher, ob ich Ihr Problem richtig verstanden habe. Ich habe jedoch Ihren Code getestet und in der Tat überlappten sich einige Zeichenfolgen.

Das Problem bestand darin, dass Sie den Wert xx inkrementieren (Sie erhöhten es vor dem Zeichnen eines Zeichens).

Hier Version des Codes korrigiert:

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

Kommentar- und stellen xx += 2 Zeilenabstand zwischen Zeichen zu erhöhen.

0

Das Problem ist, dass Kerning definiert den Abstand von Paare Buchstaben und Iterieren über eine Zeichenfolge char-by-char gibt dem Kerning-System keine Chance zu treten. Ich denke, Sie müssen entweder eine feste verwenden -breite Schriftart oder überarbeiten Sie Ihren Lichteffekt, so dass es mit vollen Strings statt einzelner Zeichen funktioniert.

2

Die Antwort von Lukas Baran löst das Hauptproblem, das Ihre Ausgabe wahrscheinlich schlecht aussehen ließ. Das subtilere Problem, das Kerning auf diese Weise nicht zu replizieren, bleibt jedoch bestehen. Wie groß das Problem ist, hängt möglicherweise von der Schriftart ab, die Sie verwenden. Um das Kerning richtig, auch, könnte man so etwas tun:

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

, dass jedes Zeichen setzen sollte, wo der Kerning es angebracht wäre.

Verwandte Themen