Canvas.drawText (…) no imprime linebreak

Intenté escribir un texto en una vista de superficie que creé. Funciona bien, si el título es falso, y no hay linebreak añadido 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, pero en su lugar hay este símbolo [] impreso.

¿Algún consejo 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()); } 

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

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

Podría probar algo como lo siguiente para dibujar texto con linebreaks:

 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(); } } 

La respuesta dee es brillante. El código siguiente se basa en la respuesta dee, pero con algunas enmiendas para las preferencias personales:

  1. Llámelo drawMultilineText (ya que es una especie de equivalente a drawText
  2. Coloque los parámetros en el mismo orden que drawText (texto, x, y, pintura y lienzo al final)
  3. Obtener la altura de la línea una vez al principio como la altura devuelta de los límites depende de la altura de las letras, es decir, e no es tan alto como E
  4. Añada 20% de separación de altura entre 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; } } 

Continuando mejorando las respuestas de Dee y FrinkTheBrave. He añadido un Rect al método para permitir el dibujo dentro del área de ancho en particular. Mirará modificarlo para seleccionar un tamaño de fuente apropiado y asegurarse de que encaja dentro del área de altura correcta.

Esto le permitirá especificar el ancho de las líneas que desea escribir, 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 fragmento de código excelente encontrado aquí en una respuesta anterior por user850688 https://stackoverflow.com/a/11353080/1759409

  • Cómo resuelve la forma redonda rect demasiado grande para ser representada en una textura en android TextBox
  • Cómo agregar el título del botón en el botón de imagen
  • Brillante texto en el botón con fondo transparente en la disposición con otro fondo
  • Cómo configurar una fuente en particular para un texto de botón en android?
  • Reducir el relleno de texto dentro de un botón
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.