Cualquier sugerencia es muy apreciada.Cómo hacer que el texto de lienzo sea seleccionable?
Respuesta
La selección de texto tiene muchos componentes visuales, algunos no visuales.
En primer lugar, para que el texto sea seleccionable, debe mantener una matriz, dónde está el texto, qué es el texto y qué fuente se utilizó. Usará esta información con la función de Lienzo measureText.
Al usar measureText, con su cadena de texto, puede identificar a qué letra debe llegar el cursor cuando hace clic en una imagen.
ctx.fillText("My String", 100, 100);
textWidth = ctx.measureText("My String").width;
de todas maneras tendrá que analizar la altura de la fuente de la propiedad "fuente", ya que no está incluido actualmente en medidas del texto. El texto de lienzo está alineado con la línea de base de forma predeterminada.
Con esta información, ahora tiene un cuadro delimitador, que puede consultar. Si el cursor está dentro del cuadro delimitador, ahora tiene la desafortunada tarea de deducir qué letra fue seleccionada intencionalmente; donde debe colocarse el inicio de su cursor. Esto puede implicar llamar a measureText varias veces.
En ese punto, usted sabe a dónde debe ir el cursor; necesitarás almacenar tu cadena de texto como una cadena de texto, en una variable, por supuesto.
Una vez que haya definido los puntos de inicio y fin de su rango, debe dibujar un indicador de selección. Esto se puede hacer en una nueva capa (un segundo elemento de lienzo), o dibujando un rectángulo usando el modo de composición XOR.También se puede hacer por simplemente borrando y redibujando el texto en la parte superior de un rectángulo lleno.
Dicho todo esto, la selección de texto, la edición de texto en Canvas son bastante laboriosas de programar, y sería prudente reutilizar los componentes ya escritos, Bespin es un excelente ejemplo.
Editaré mi publicación si encuentro otros ejemplos públicos. Creo que Bespin utiliza un método de selección basado en la cuadrícula, que posiblemente requiera una fuente de espacio único. Las ligaduras, interletraje, bidireccionalidad y otras características avanzadas de representación de fuente requieren programación adicional; es un problema complejo.
Sí, Bespin requiere una fuente monoespaciada. – devongovett
lienzo es solo una superficie de dibujo. Usted rinde y el resultado es píxeles. Por lo tanto, necesitaría rastrear las posiciones de todo el texto que haya renderizado en el lienzo en algún tipo de estructura de datos que procesaría durante los eventos del mouse.
Si necesita tener texto seleccionable, sería mucho más fácil crear un div o lo que sea, y colocarlo en la parte superior del lienzo donde desea que se muestre el texto.
lienzo no tiene ningún mecanismo incorporado para seleccionar texto, por lo que tendría que implementar su propio texto y seleccionar el código, lo que puede ser un poco complicado de hacer bien.
no se puede seleccionar el texto dibujado en elementos de lienzo debido a la naturaleza de la etiqueta canvas. Pero hay algunas soluciones, como la que se usa en typefaceJS.
Otra solución sería agregar texto con elementos div posicionados en lugar de usar strokeText o fillText.
Puede obtener algunas ideas de Bespin.
implementaron un editor de texto en JavaScript utilizando lienzo con la selección de texto, barras de desplazamiento, cursor parpadeante, etc.
Mientras tanto, Bespin fue reemplazado por SkyWriter, que está inactivo y [se ha fusionado en Ace] (https://mozillalabs.com/en-US/skywriter/). –
El proyecto está inactivo. – Pacerier
Una respuesta simple sería: o bien utilizar HTML o SVG en lugar de lienzo . A menos que realmente necesite el grado de ofertas de lona de control de bajo nivel.
FabricJS ahora tiene la capacidad de interactuar con objetos fuera del elemento de lienzo; por ejemplo, this demo muestra un botón que está vinculado a una imagen cargada en un elemento de lienzo.
El mismo enfoque se puede usar en otras librerías como Raphael enganchando cualquier evento move, obteniendo el cuadro delimitador del elemento y reposicionando el elemento HTML.
Sugeriría usar la biblioteca EaselJS, puede agregar cada letra como un niño e incluso agregar eventos de mouse a ese objeto, es una biblioteca increíble, ¡vaya a verlo!
- 1. ¿Cómo puedo hacer que una UITextView no sea seleccionable?
- 2. ¿Puedo hacer que un elemento ListView no sea seleccionable?
- 3. Hacer que Firefox renderice el texto del lienzo de la misma manera que el texto CSS
- 4. ¿Cómo hacer que EditText sea seleccionable pero no editable en Android Ice Cream Sandwich?
- 5. Cómo hacer que el texto sea negrita usando jquery
- 6. Hacer texto en enlace seleccionable con CSS
- 7. ¿Hay alguna manera de hacer que un DIV no sea seleccionable?
- 8. ¿Cómo puedo hacer TextBlock como seleccionable por lo que el usuario puede copiar el texto
- 9. ¿Cómo puedo hacer que esta vista de lista no sea seleccionable?
- 10. ¿Cómo hacer que el clip Canvas sea contenido en Flex?
- 11. Haciendo texto no seleccionable
- 12. ¿Cómo hacer que un texto sea rojo en mediawiki?
- 13. ¿Cómo hacer que el archivo sea escaso?
- 14. mostrando texto seleccionable WPF
- 15. ordenable con texto seleccionable
- 16. ¿Cómo hacer que el fondo de un JCheckBox sea transparente?
- 17. ¿Cómo hacer que el fondo de una JTable sea transparente?
- 18. WP7 + HTML5 - Cómo evitar que un lienzo sea seleccionado/resaltado
- 19. make html texto no seleccionable
- 20. WPF: ¿Cómo hacer que el lienzo cambie el tamaño automáticamente?
- 21. Cómo evitar que el texto seleccione un lienzo de HTML5 externo al hacer doble clic en?
- 22. ¿Cómo hacer que el ancho del botón sea autofit el texto de un botón?
- 23. Hacer texto seleccionable en un área de texto dentro de un padre ordenable jQuery
- 24. ¿Cómo hacer que EditText sea más pequeño que el predeterminado?
- 25. ¿Cómo hacer que Unix sea binario autónomo?
- 26. ¿Cómo hacer que el automake sea menos feo?
- 27. Android cómo hacer que el texto de TextView sea negrita cuando se presiona o se enfoca
- 28. ¿Cómo puedo hacer que el fondo de mi sitio web sea transparente sin hacer que el contenido (imágenes y texto) también sea transparente?
- 29. Cómo hacer que PictureBox sea desplazable
- 30. Cómo hacer que strpos sea insensible
Dado que las respuestas tienen casi 3 años, ¿hay alguna otra solución o biblioteca lista para usar que pueda usarse? – Cybrix
@ Cybrix - sí, vea mi respuesta debajo de – Neil