Parece que no puedo agregar texto a un lienzo si el texto incluye "\ n". Quiero decir, los saltos de línea no se muestran / funcionan.
ctxPaint.fillText("s ome \n \\n <br/> thing", x, y);
El código anterior se dibujará "s ome \n <br/> thing"
en una línea.
¿Es esta una limitación de fillText o lo estoy haciendo mal? las "\ n" están ahí y no están impresas, pero tampoco funcionan.
fillText()
varias veces y use la altura de su fuente para separar, o use developer.mozilla.org/en-US/docs/Web/API/TextMetrics developer.mozilla.org/en-US/docs/Web/API /… - o, use una de las "soluciones" muy complicadas a continuación que no usan TextMetrics ...Respuestas:
Me temo que es una limitación de Canvas '
fillText
. No hay soporte para varias líneas. Lo que es peor, no hay una forma incorporada de medir la altura de la línea, solo el ancho, ¡lo que hace que hacerlo usted mismo sea aún más difícil!Mucha gente ha escrito su propio soporte multilínea, quizás el proyecto más notable que tiene es Mozilla Skywriter .
La esencia de lo que deberá hacer es realizar varias
fillText
llamadas mientras agrega la altura del texto al valor y cada vez. (Creo que medir el ancho de M es lo que hacen las personas que escriben en el cielo para aproximar el texto).fuente
measureText()
han añadido que creo que podría resolver el problema. Chrome tiene una bandera para habilitarlos, pero otros navegadores no ... ¡todavía!Si solo desea cuidar los caracteres de nueva línea en el texto, puede simularlo dividiendo el texto en las líneas nuevas y llamando varias veces al
fillText()
Algo como http://jsfiddle.net/BaG4J/1/
Acabo de hacer una prueba de concepto de envoltura ( envoltura absoluta en el ancho especificado. Aún no se pueden romper palabras de manejo )
en http://jsfiddle.net/BaG4J/2/
Y una prueba de concepto que envuelve palabras ( rompiendo espacios ).
ejemplo en http://jsfiddle.net/BaG4J/5/
En el segundo y tercer ejemplo, estoy usando el
measureText()
método que muestra cuánto tiempo ( en píxeles ) será una cadena cuando se imprima.fuente
Quizás llegar a esta fiesta un poco tarde, pero el siguiente tutorial para envolver texto en un lienzo me pareció perfecto.
http://www.html5canvastutorials.com/tutorials/html5-canvas-wrap-text-tutorial/
A partir de eso, pude pensar en hacer funcionar varias líneas (lo siento Ramírez, ¡la tuya no funcionó para mí!) Mi código completo para envolver texto en un lienzo es el siguiente:
¿Dónde
c
está el ID de mi lienzo ytext
es el ID de mi cuadro de texto?Como probablemente pueda ver, estoy usando una fuente no estándar. Puede usar @ font-face siempre que haya usado la fuente en algún texto ANTES de manipular el lienzo; de lo contrario, el lienzo no recogerá la fuente.
Espero que esto ayude a alguien.
fuente
Divida el texto en líneas y dibuje cada una por separado:
fuente
Aquí está mi solución, modificando la popular función wrapText () que ya se presenta aquí. Estoy usando la función de creación de prototipos de JavaScript para que pueda llamar a la función desde el contexto del lienzo.
Uso básico:
Aquí hay una demostración que armé : http://jsfiddle.net/7RdbL/
fuente
Acabo de extender CanvasRenderingContext2D agregando dos funciones: mlFillText y mlStrokeText.
Puedes encontrar la última versión en GitHub :
Con estas funciones puede rellenar / trazar texto miltiline en un cuadro. Puede alinear el texto vertical y horizontalmente. (Tiene en cuenta \ n's y también puede justificar el texto).
Los prototipos son:
función mlFillText (texto, x, y, w, h, vAlign, hAlign, lineheight); función mlStrokeText (texto, x, y, w, h, vAlign, hAlign, lineheight);
Donde vAlign puede ser: "arriba", "centro" o "botón" y hAlign puede ser: "izquierda", "centro", "derecha" o "justificar"
Puede probar la biblioteca aquí: http://jsfiddle.net/4WRZj/1/
Aquí está el código de la biblioteca:
Y aquí está el ejemplo de uso:
fuente
Uncaught ReferenceError: Words is not defined
Si intento cambiar la fuente. Por ejemplo:ctx.font = '40px Arial';
- intente poner eso en su violínWords
viene la variable (sensible a mayúsculas y minúsculas)? No está definido en ninguna parte. Esa parte del código sólo será ejecutado cuando se cambia la fuente ..for in
que no funciona bien con extendidoArray.prototype
. ¿Podrías ponerlo en github para que podamos iterar sobre él?Usando javascript desarrollé una solución. No es hermoso pero funcionó para mí:
¡Espero que ayude!
fuente
El código para el ajuste de palabras ( separación de espacios) proporcionado por @Gaby Petrioli es muy útil. He ampliado su código para proporcionar compatibilidad con caracteres de nueva línea
\n
. Además, a menudo es útil tener las dimensiones del cuadro delimitador, por lo quemultiMeasureText()
devuelve tanto el ancho como el alto.Puedes ver el código aquí: http://jsfiddle.net/jeffchan/WHgaY/76/
fuente
Aquí hay una versión de Colin
wrapText()
que también admite texto centrado verticalmente concontext.textBaseline = 'middle'
:fuente
Si solo necesita dos líneas de texto, puede dividirlas en dos llamadas fillText diferentes y dar a cada una una línea de base diferente.
fuente
Esta pregunta no está pensada en términos de cómo funciona el lienzo. Si desea un salto de línea, simplemente ajuste las coordenadas del siguiente
ctx.fillText
.fuente
Creo que todavía puedes confiar en CSS
Afortunadamente, a través de CSS hack-ardry (consulte Métricas tipográficas para conocer más formas de corregir implementaciones anteriores del uso de medidas CSS), podemos encontrar la altura del texto midiendo el offsetHeight de a con las mismas propiedades de fuente:
de: http://www.html5rocks.com/en/tutorials/canvas/texteffects/
fuente
ctx.save()
entonces,ctx.font = '12pt Arial'
entoncesparseInt( ctx.font, 10 )
,. Tenga en cuenta que utilizo 'pt' al configurarlo. Luego se traducirá a PX y podrá convertirse en un dígito para consumo como la altura de la fuente.Creé una pequeña biblioteca para este escenario aquí: Canvas-Txt
Representa el texto en varias líneas y ofrece modos de alineación decentes.
Para usar esto, necesitará instalarlo o usar un CDN.
Instalación
JavaScript
Esto representará el texto en un cuadro invisible con la posición / dimensiones de:
Ejemplo de violín
fuente
ctx.fillText(txtline.trim(), textanchor, txtY)
, solo noté esto en su demostración interactiva en su sitio web.2.0.9
versión. El sitio de demostración se arregla actualizando la versión del paquete. Hay un problema con varios espacios. No sé si es mejor optar por un paquete obstinado o ignorar el problema. Recibí solicitudes para esto de varios lugares. Seguí adelante y agregué recorte de todos modos.Lorem ipsum dolor, sit <many spaces> amet
esta fue la razón por la que no lo hice en primer lugar. ¿Qué crees que debería considerar varios espacios y solo eliminar si solo hay uno?No creo que esto sea posible tampoco, pero una solución para esto es crear un
<p>
elemento y colocarlo con Javascript.fuente
fillText()
ystrokeText()
puedes hacer cosas más allá de lo que CSS puede hacer.Me encontré con esto debido a que tuve el mismo problema. Estoy trabajando con un tamaño de fuente variable, así que esto lo tiene en cuenta:
donde .noteContent es el div contenteditable que editó el usuario (esto está anidado en un jQuery para cada función), y ctx.font es "14px Arial" (observe que el tamaño de píxel es lo primero)
fuente
El elemento Canvas no admite caracteres como la nueva línea '\ n', la pestaña '\ t' o la etiqueta <br />.
Intentalo:
o quizás varias líneas:
fuente
Mi solución ES5 para el problema:
Más información sobre el tema está en mi blog .
fuente