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é?
- Android: mover el texto del botón a la parte inferior
- Cómo obtener líneas máximas de texto
- ¿Cómo centrar el texto horizontal y verticalmente en un TextView en Android?
- Imagen de la imagen del botón de Android en el centro y el texto en la parte inferior
- Destacando el color del texto usando Html.fromHtml () en Android?
@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()); }
- Cómo dibujar con una fuente predeterminada de Android en una lona?
- Metaio sdk (openGL) frena la representación de fuente y de imagen
- Cómo obtener la altura y el ancho de un texto con Canvas
- El botón se mueve al agregar texto de varias líneas
- Cómo configurar el texto en el centro en la aplicación ListView android?
- Cambiar el texto de un botón dentro de un ListView en Android
- Android: Iniciar actividad desde un texto que se puede hacer clic
- Problema de recorte de texto de Android con EditView dentro de un TableLayout
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:
- Llámelo drawMultilineText (ya que es una especie de equivalente a drawText
- Coloque los parámetros en el mismo orden que drawText (texto, x, y, pintura y lienzo al final)
- 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
-
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
- Calcular la diferencia entre dos veces en Android
- Cómo resolver los archivos duplicados copiados en APK META-INF / rxjava.properties