2011-01-03 12 views
5

Estoy tratando de dibujar cadenas carácter por carácter para agregar efectos de iluminación a las formas compuestas de texto.Problemas de kerning al dibujar texto carácter por carácter

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

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

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

El problema es que el ancho de un carácter no es la distancia real que se extrae de otro personaje cuando esos dos caracteres se imprimen como una cadena. ¿Hay alguna manera de obtener la distancia correcta en graphics2d?

Respuesta

0

No estoy seguro de haber entendido bien tu problema. Sin embargo, he probado su código y, de hecho, algunos caracteres de cadena se superponen entre sí.

El problema estaba en la forma en que está incrementando el valor xx (lo estaba incrementando antes de dibujar un carácter).

Aquí está corregido versión de su código:

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

Descomentar y ajustar xx += 2 línea para aumentar el espacio entre caracteres.

0

El problema es que el kerning define el espaciado de pares de letras, y al iterar sobre una cadena char-by-char no le da oportunidad al sistema de interletraje de patear. Creo que tendrá que usar un arreglo de ancho o reelabore su efecto de iluminación para que funcione con cadenas completas en lugar de caracteres únicos.

2

La respuesta de Lukas Baran resuelve el problema principal que probablemente causaba que tu salida se viera mal. Sin embargo, el problema más sutil de que no puede replicar el kerning de esta manera permanece. La cantidad de problema que esto puede depender de la fuente que está utilizando. Para obtener el derecho de interletraje, también, se podría hacer algo como esto:

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

Eso se debe colocar cada carácter en el que el ajuste entre caracteres hubiera colocado.

Cuestiones relacionadas