Je n'arrive pas à ajouter du texte à un canevas si le texte comprend "\ n". Je veux dire, les sauts de ligne ne montrent pas / ne fonctionnent pas.
ctxPaint.fillText("s ome \n \\n <br/> thing", x, y);
Le code ci-dessus dessinera "s ome \n <br/> thing"
sur une seule ligne.
Est-ce une limitation de fillText ou est-ce que je le fais mal? les "\ n" sont là, et ne sont pas imprimés, mais ils ne fonctionnent pas non plus.
fillText()
plusieurs fois et utilisez la hauteur de votre police pour séparer, ou utilisez developer.mozilla.org/en-US/docs/Web/API/TextMetrics developer.mozilla.org/en-US/docs/Web/API /… - ou, utilisez l'une des "solutions" très compliquées ci-dessous qui n'utilisent pas TextMetrics ...Réponses:
J'ai peur que ce soit une limitation de Canvas »
fillText
. Il n'y a pas de support multiligne. Pire encore, il n'y a pas de moyen intégré de mesurer la hauteur de la ligne, seulement la largeur, ce qui rend le faire vous-même encore plus difficile!Beaucoup de gens ont écrit leur propre support multi-lignes, peut-être le projet le plus remarquable qui a été Mozilla Skywriter .
L'essentiel de ce que vous devrez faire est plusieurs
fillText
appels tout en ajoutant la hauteur du texte à la valeur y à chaque fois. (mesurer la largeur de M est ce que les gens de skywriter font pour approximer le texte, je crois.)la source
measureText()
ont été ajoutées que je pense pourrait résoudre le problème. Chrome a un indicateur pour les activer, mais les autres navigateurs ne le font pas ... encore!Si vous voulez simplement vous occuper des caractères de nouvelle ligne dans le texte, vous pouvez le simuler en divisant le texte aux nouvelles lignes et en appelant plusieurs fois le
fillText()
Quelque chose comme http://jsfiddle.net/BaG4J/1/
Je viens de créer un exemple de preuve de concept d'emballage ( enveloppement absolu à la largeur spécifiée. Pas de rupture de mots de manipulation, pour le moment )
à http://jsfiddle.net/BaG4J/2/
Et une preuve de concept enveloppant les mots ( cassant les espaces ).
exemple sur http://jsfiddle.net/BaG4J/5/
Dans les deuxième et troisième exemples, j'utilise la
measureText()
méthode qui montre la longueur ( en pixels ) d'une chaîne lors de l'impression.la source
Peut-être que je viens à cette fête un peu tard, mais j'ai trouvé le tutoriel suivant pour envelopper du texte sur une toile parfait.
http://www.html5canvastutorials.com/tutorials/html5-canvas-wrap-text-tutorial/
À partir de là, j'ai pu penser à faire fonctionner plusieurs lignes (désolé Ramirez, le vôtre n'a pas fonctionné pour moi!). Mon code complet pour envelopper du texte dans un canevas est le suivant:
Où
c
est l'ID de ma toile ettext
l'ID de ma zone de texte.Comme vous pouvez probablement le voir, j'utilise une police non standard. Vous pouvez utiliser @ font-face tant que vous avez utilisé la police sur du texte AVANT de manipuler le canevas - sinon le canevas ne prendra pas la police.
J'espère que cela aide quelqu'un.
la source
Divisez le texte en lignes et dessinez chacune séparément:
la source
Voici ma solution, en modifiant la fonction populaire wrapText () qui est déjà présentée ici. J'utilise la fonctionnalité de prototypage de JavaScript afin que vous puissiez appeler la fonction à partir du contexte de canevas.
Utilisation de base:
Voici une démonstration que j'ai préparée : http://jsfiddle.net/7RdbL/
la source
Je viens d'étendre le CanvasRenderingContext2D en ajoutant deux fonctions: mlFillText et mlStrokeText.
Vous pouvez trouver la dernière version dans GitHub :
Avec ces fonctions, vous pouvez remplir / tracer du texte miltiline dans une boîte. Vous pouvez aligner le texte verticalement et horizontalement. (Il prend en compte les \ n et peut également justifier le texte).
Les prototypes sont:
function mlFillText (texte, x, y, w, h, vAlign, hAlign, lineheight); function mlStrokeText (texte, x, y, w, h, vAlign, hAlign, lineheight);
Où vAlign peut être: "top", "center" ou "button" Et hAlign peut être: "left", "center", "right" ou "justify"
Vous pouvez tester la lib ici: http://jsfiddle.net/4WRZj/1/
Voici le code de la bibliothèque:
Et voici l'exemple d'utilisation:
la source
Uncaught ReferenceError: Words is not defined
Si j'essaye de changer de police. Par exemple:ctx.font = '40px Arial';
- essayez de mettre ça dans votre violonWords
variable (sensible à la casse) ?? Ce n'est défini nulle part. Cette partie du code n'est exécutée que lorsque vous changez de police.for in
ne fonctionne pas bien avec extendedArray.prototype
. Pourriez-vous le mettre sur github afin que nous puissions l'itérer?En utilisant javascript, j'ai développé une solution. Ce n'est pas beau mais cela a fonctionné pour moi:
J'espère que cela pourra aider!
la source
Le code de retour à la ligne (coupure aux espaces) fourni par @Gaby Petrioli est très utile. J'ai étendu son code pour prendre en charge les caractères de nouvelle ligne
\n
. De plus, il est souvent utile d'avoir les dimensions du cadre de sélection, doncmultiMeasureText()
renvoie à la fois la largeur et la hauteur.Vous pouvez voir le code ici: http://jsfiddle.net/jeffchan/WHgaY/76/
la source
Voici une version de Colin
wrapText()
qui prend également en charge le texte centré verticalement aveccontext.textBaseline = 'middle'
:la source
Si vous n'avez besoin que de deux lignes de texte, vous pouvez les diviser en deux appels fillText différents et attribuer à chacun une ligne de base différente.
la source
Cette question ne concerne pas le fonctionnement de la toile. Si vous voulez un saut de ligne, ajustez simplement les coordonnées de votre prochain
ctx.fillText
.la source
Je pense que vous pouvez toujours compter sur CSS
Heureusement, grâce à CSS hack-ardry (voir Métriques typographiques pour plus de moyens de corriger les anciennes implémentations de l'utilisation des mesures CSS), nous pouvons trouver la hauteur du texte en mesurant l'offsetHeight de a avec les mêmes propriétés de police:
de: http://www.html5rocks.com/en/tutorials/canvas/texteffects/
la source
ctx.save()
alors,ctx.font = '12pt Arial'
alorsparseInt( ctx.font, 10 )
,. Notez que j'utilise «pt» lors du réglage. Il se traduira alors en PX et pourra se transformer en chiffre à consommer comme la hauteur de la police.J'ai créé une petite bibliothèque pour ce scénario ici: Canvas-Txt
Il rend le texte sur plusieurs lignes et offre des modes d'alignement décents.
Pour l'utiliser, vous devrez soit l'installer, soit utiliser un CDN.
Installation
JavaScript
Cela rendra le texte dans une boîte invisible avec la position / les dimensions de:
Exemple de violon
la source
ctx.fillText(txtline.trim(), textanchor, txtY)
je n'ai remarqué cela que dans votre démo interactive sur votre site Web.2.0.9
version. Le site de démonstration est corrigé en mettant à jour la version du package. Il y a un problème avec plusieurs espaces. Je ne sais pas s'il vaut mieux aller avec un paquet opiniâtre ou ignorer le problème. J'ai reçu des demandes pour cela de plusieurs endroits. Je suis allé de l'avant et j'ai quand même ajouté des garnitures.Lorem ipsum dolor, sit <many spaces> amet
c'était la raison pour laquelle je ne l'ai pas fait en premier lieu. Que pensez-vous que je devrais considérer plusieurs espaces et ne supprimer que s'il n'y en a qu'un?Je ne pense pas que ce soit possible non plus, mais une solution de contournement pour cela est de créer un
<p>
élément et de le positionner avec Javascript.la source
fillText()
etstrokeText()
, vous pouvez faire des choses au-delà de ce que CSS peut faire.Je suis tombé sur cela en raison du même problème. Je travaille avec une taille de police variable, donc cela prend cela en compte:
où .noteContent est le div contenteditable que l'utilisateur a modifié (il est imbriqué dans un jQuery chaque fonction), et ctx.font est "14px Arial" (notez que la taille du pixel vient en premier)
la source
L'élément Canvas ne prend pas en charge les caractères tels que le retour à la ligne '\ n', la tabulation '\ t' ou la balise <br />.
Essayez-le:
ou peut-être plusieurs lignes:
la source
Ma solution ES5 pour le problème:
Plus d'informations sur le problème sont sur mon blog .
la source