2011-01-03 10 views
5

Sto provando a disegnare stringhe carattere per carattere per aggiungere effetti di luce a forme composte da testo.Problemi di crenatura durante il disegno del testo carattere per carattere

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

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

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

Il problema è, la larghezza di un carattere non è la distanza effettiva è disegnato da un altro personaggio quando questi due caratteri vengono stampati come una stringa. C'è un modo per ottenere la distanza corretta in graphics2d?

risposta

0

Non sono sicuro di aver capito correttamente il problema. Tuttavia, ho testato il tuo codice e in effetti alcuni caratteri di stringa si sovrappongono l'un l'altro.

Il problema era in un modo in cui si sta incrementando il valore xx (si stava incrementando prima di disegnare un carattere).

Ecco corretta versione del codice:

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

Decommentare e regolare xx += 2 linea per aumentare lo spazio tra i caratteri.

0

Il problema è che la crenatura definisce la spaziatura delle coppie di lettere, e l'iterazione di una stringa char-by-char conferisce al sistema la crenatura alcuna possibilità di calciare in. Penso che si dovrà utilizzare un fisso -width font o rielaborare l'effetto di illuminazione in modo che funzioni con stringhe complete invece di singoli caratteri.

2

La risposta di Lukas Baran risolve il problema principale che probabilmente causava un cattivo aspetto dell'output. Tuttavia, rimane il problema più sottile che non è possibile replicare il kerning in questo modo. Quanto di questo problema può dipendere dal tipo di carattere che stai utilizzando. Per ottenere il giusto crenatura, troppo, si potrebbe fare qualcosa di simile:

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

Questo dovrebbe posizionare ciascun carattere in cui la crenatura avrebbe messo esso.

Problemi correlati