2010-06-30 17 views
6

Traté de escribir algo de texto en una vista de superficie que creé. Funciona bien, si el título es falso y no se agrega un salto de línea al texto. Pero si agrego un título y, por lo tanto, un salto de línea, el salto de línea no se imprime como se esperaba, sino que aparece este símbolo [] impreso.Canvas.drawText (...) no imprime linebreak

¿Alguna pista de por qué?

@Override 
public void drawObject() { 
String text = ""; 
if (title) { 
    text = getGameBoard().getGame().getForeignProfile().getName() + "\n"; 
} 
text = text + getScoreAsString(); 
getGameBoard().getCanvas().drawText(text, 0, text.length(), getPosition().getX(), getPosition().getY(), getPaint()); 
} 

Respuesta

1

El símbolo [] es probablemente su carácter de nueva línea. Por alguna razón, drawText() no sabe cómo manejar nuevas líneas.

Borre la nueva línea o llame a drawText() dos veces con una posición Y desplazada para simular una nueva línea.

+0

gracias. No sabía que no admite Newline. eso es realmente molesto ¿Qué quieres decir con tirar la nueva línea? – RoflcoptrException

+0

Utilice String.replace() para reemplazar todas las instancias de "\ n" por "" (una cadena vacía). –

+0

ah sí, ese no es el problema, el código anterior es la única situación en la que lo necesito;) y como pueden ver, agregó el "\ n" yo solo – RoflcoptrException

24

usted podría intentar algo como lo siguiente para dibujar texto con saltos de línea: Respuesta

Rect bounds = new Rect(); 
void drawString(Canvas canvas, Paint paint, String str, int x, int y) { 
    String[] lines = str.split("\n"); 

    int yoff = 0; 
    for (int i = 0; i < lines.length; ++i) { 
     canvas.drawText(lines[i], x, y + yoff, paint); 
     paint.getTextBounds(lines[i], 0, lines[i].length(), bounds); 
     yoff += bounds.height(); 
    } 
} 
8

de Dee es brillante. El código siguiente se basa en la respuesta de Dee, pero con algunas modificaciones para las preferencias personales:

  1. Llámalo drawMultilineText (ya que es una especie de equivalente a drawText
  2. puso a los parámetros en el mismo orden que drawText (texto, x , y, pintura y el lienzo en el extremo)
  3. Obtener la altura de la línea una vez al inicio como la altura de regresar de los límites depende de la altura de las letras, es decir, e no es tan alto como e
  4. Añadir 20 % de la diferencia de altura entre las líneas

    void drawMultilineText(String str, int x, int y, Paint paint, Canvas canvas) { 
        int  lineHeight = 0; 
        int  yoffset = 0; 
        String[] lines  = str.split("\n"); 
    
        // set height of each line (height of text + 20%) 
        paint.getTextBounds("Ig", 0, 2, mBounds); 
        lineHeight = (int) ((float) mBounds.height() * 1.2); 
        // draw each line 
        for (int i = 0; i < lines.length; ++i) { 
         canvas.drawText(lines[i], x, y + yoffset, paint); 
         yoffset = yoffset + lineHeight; 
        } 
    } 
    
+0

Magia !! Thx @dee me salvó el día – Billyjoker

4

Continuando mejorando las respuestas de Dee y FrinkTheBrave. Agregué un Rect al método para permitir el dibujo dentro de un área de ancho particular. Verá cómo modificarlo para seleccionar un tamaño de fuente apropiado y asegurarse de que se ajuste dentro del área de altura correcta.

Esto le permitirá especificar el ancho de las líneas que desea escribir, lo que es muy útil para dividir una cadena de texto sin formato en líneas de longitud similares y dibujarlas en un lienzo.

private void drawMultilineText(String str, int x, int y, Paint paint, Canvas canvas, int fontSize, Rect drawSpace) { 
    int  lineHeight = 0; 
    int  yoffset = 0; 
    String[] lines  = str.split(" "); 

    // set height of each line (height of text + 20%) 
    lineHeight = (int) (calculateHeightFromFontSize(str, fontSize) * 1.2); 
    // draw each line 
    String line = ""; 
    for (int i = 0; i < lines.length; ++i) { 

     if(calculateWidthFromFontSize(line + " " + lines[i], fontSize) <= drawSpace.width()){ 
      line = line + " " + lines[i]; 

     }else{ 
      canvas.drawText(line, x, y + yoffset, paint); 
      yoffset = yoffset + lineHeight; 
      line = lines[i]; 
     } 
    } 
    canvas.drawText(line, x, y + yoffset, paint); 

} 

private int calculateWidthFromFontSize(String testString, int currentSize) 
{ 
    Rect bounds = new Rect(); 
    Paint paint = new Paint(); 
    paint.setTextSize(currentSize); 
    paint.getTextBounds(testString, 0, testString.length(), bounds); 

    return (int) Math.ceil(bounds.width()); 
} 

private int calculateHeightFromFontSize(String testString, int currentSize) 
{ 
    Rect bounds = new Rect(); 
    Paint paint = new Paint(); 
    paint.setTextSize(currentSize); 
    paint.getTextBounds(testString, 0, testString.length(), bounds); 

    return (int) Math.ceil(bounds.height()); 
} 

Esta respuesta incluye este excelente fragmento de código que se encuentra aquí en una respuesta anterior por user850688 https://stackoverflow.com/a/11353080/1759409

+0

y drawSpace sería ...? – desgraci

+0

drawSpace es una variable Rect que envía al método para que el método sepa qué tan grande está disponible un área para rellenar con texto. –

+0

@MusicMonkey no es la altura de cada línea exactamente igual que el tamaño de la fuente? –

Cuestiones relacionadas