2011-01-03 17 views
5

Próbuję narysować ciąg znaków według znaków, aby dodać efekty świetlne do kształtów złożonych z tekstu.Problemy z kerningiem podczas rysowania tekstu znak po znaku

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

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

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

Problem polega na tym, szerokość znaku nie jest rzeczywista odległość to wyciągnąć z innego charakteru, kiedy te dwa znaki są drukowane jako ciąg znaków. Czy istnieje sposób na uzyskanie prawidłowej odległości w graphics2d?

Odpowiedz

0

Nie jestem pewien, czy dobrze zrozumiałem Twój problem. Jednak przetestowałem twój kod, a niektóre ciągi znaków nakładają się na siebie.

Problem polegał na tym, że zwiększasz wartość o xx (zwiększałeś ją przed rysowaniem postaci).

Tutaj jest skorygowana wersja kodu:

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

Odkomentuj i dostosować xx += 2 linię do zwiększenia przestrzeni pomiędzy znakami.

0

Problem polega na tym, że kerning definiuje odstępy między literami , a powtarzanie ciągu znaków char-by-char nie daje szansy na uruchomienie systemu kerningu. Myślę, że będziesz musiał użyć -width czcionki lub przerobić efekt oświetlenia, więc działa z pełną ciągów zamiast pojedynczych znaków.

2

Odpowiedź Lukasa Barana rozwiązuje główny problem, który prawdopodobnie spowodował, że wydruki wyglądają źle. Jednak bardziej subtelny problem, że nie można replikować kerningu w ten sposób, pozostaje. Jak duży jest to problem, może zależeć od używanej czcionki. Aby uzyskać prawo kerningu też można zrobić coś takiego:

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

To powinno umieścić każdy znak, gdzie kerning byłaby umieszczona go.

Powiązane problemy