Una pregunta con suerte rápida, pero parece que no puedo encontrar ningún ejemplo ... Me gustaría escribir un texto de varias líneas a View
través de un personalizado Canvas
, y en onDraw()
:
...
String text = "This is\nmulti-line\ntext";
canvas.drawText(text, 100, 100, mTextPaint);
...
Esperaba que esto resultara en saltos de línea, pero en cambio estoy viendo personajes crípticos donde \n
estaría.
Cualquier puntero apreciado.
Pablo
android
android-canvas
Paul Mennega
fuente
fuente
Layout
lugar de llamarCanvas.drawText
directamente. Estas preguntas y respuestas muestran cómo usar aStaticLayout
para dibujar texto multilínea.Respuestas:
Lamentablemente, Android no sabe qué
\n
es. Lo que tiene que hacer es quitar la\n
y luego compensar la Y para obtener su texto en la siguiente línea. Entonces algo como esto:fuente
drawText()
?Encontré otra forma de usar diseños estáticos. El código está aquí para que cualquiera lo consulte:
fuente
canvas.getWidth()
realmente debería sergetWidth() - getPaddingLeft() - getPaddingRight()
, para tener en cuenta el relleno de la vista. Además, tenga en cuenta que puede calcular el StaticLayout solo cuando su texto o el tamaño de su vista cambien y dibujarlo sin construir uno nuevo, ¡lo que probablemente sea mejor!Solo itera por cada línea:
fuente
He escrito un ejemplo completo
colors.xml
clase java
fuente
int noOfLines = gText.split("\n").length
Esta es mi solución que se basa en la respuesta de @ Dave (gracias por cierto ;-))
Traté de heredar Canvas, pero realmente no te deja. ¡Entonces esta es una clase intermedia!
fuente
Tengo que agregar aquí mi versión que también considera ANCHO DE CARRERA.
fuente
funcionará. probé
Fuente: http://www.skoumal.net/en/android-drawing-multiline-text-on-bitmap/
fuente
Si. Úselo
canvas.getFontSpacing()
como el incremento. Lo probé por curiosidad y funciona para cualquier tamaño de fuente.fuente
prueba esto
fuente
Reutilicé la solución propuesta por GreenBee e hice una función para dibujar texto de varias líneas en límites específicos con el "..." al final si ocurriera un truncamiento:
fuente
Solución sin StaticLayout
fuente
Trabajé con lo que tenía, que ya convertía líneas individuales en lienzos, y trabajé con la respuesta de Lumis, y terminé con esto. El 1.3 y el 1.3f son como relleno entre líneas, en relación con el tamaño de la fuente.
fuente
Me enfrenté a un problema similar. pero debería devolver el camino del texto. Puedes dibujar este camino en Canvas. Este es mi código. Yo uso Break Text. y path.op
y para encontrar texto enlazado utilicé esta función
fuente
Para usuarios de Kotlin. El texto de varias líneas se puede crear con StaticLayout . Encontré una gran explicación y cómo usarla como una función de extensión aquí. https://medium.com/over-engineering/drawing-multiline-text-to-canvas-on-android-9b98f0bfa16a
fuente
Además de dibujar texto multilínea, uno puede tener dificultades para obtener los límites del texto multilínea (por ejemplo, para alinearlo en el lienzo).
El valor predeterminado
paint.getTextBounds()
no funcionará en este caso, ya que medirá la única línea.Por conveniencia, creé estas 2 funciones de extensión: una para dibujar texto multilínea y la otra para obtener límites de texto.
Ahora usarlo es tan fácil como eso: para dibujar texto multilínea:
Para medir texto:
val límites = yourPaint.getTextBoundsMultiLine (texto)
En este caso, medirá todo el texto desde el principio hasta el final y con el uso de Rect predeterminado (mutable) una vez asignado.
Puede jugar con pasar parámetros adicionales para mayor flexibilidad.
fuente
Mi ejemplo con Dynamic Text Sizing and spacing, funciona muy bien para mí ...
fuente