Ich kann anscheinend keinen Text zu einer Zeichenfläche hinzufügen, wenn der Text "\ n" enthält. Ich meine, die Zeilenumbrüche werden nicht angezeigt / funktionieren nicht.
ctxPaint.fillText("s ome \n \\n <br/> thing", x, y);
Der obige Code wird "s ome \n <br/> thing"
in einer Zeile gezeichnet.
Ist dies eine Einschränkung von fillText oder mache ich es falsch? Die "\ n" sind da und werden nicht gedruckt, aber sie funktionieren auch nicht.
fillText()
mehrmals auf und verwenden Sie Ihre Schrifthöhe zum Trennen oder verwenden Sie developer.mozilla.org/en-US/docs/Web/API/TextMetrics developer.mozilla.org/en-US/docs/Web/API /… - oder verwenden Sie eine der sehr komplizierten "Lösungen", die TextMetrics nicht verwenden ...Antworten:
Ich fürchte, es ist eine Einschränkung von Canvas
fillText
. Es gibt keine Unterstützung für mehrere Leitungen. Was noch schlimmer ist, es gibt keine eingebaute Möglichkeit, die Linienhöhe zu messen, nur die Breite, was es noch schwieriger macht, es selbst zu tun!Viele Leute haben ihre eigene Unterstützung für mehrere Zeilen geschrieben, das vielleicht bemerkenswerteste Projekt, das es gibt, ist Mozilla Skywriter .
Das Wesentliche, was Sie tun müssen, sind mehrere
fillText
Aufrufe, während Sie jedes Mal die Höhe des Textes zum y-Wert hinzufügen. (Ich glaube, die Skywriter messen die Breite von M, um den Text zu approximieren.)quelle
measureText()
hinzugefügt, die meines Erachtens das Problem lösen könnten. Chrome hat eine Flagge, um sie zu aktivieren, andere Browser jedoch noch nicht ...!Wenn Sie sich nur um die Zeilenumbrüche im Text kümmern möchten, können Sie dies simulieren, indem Sie den Text an den Zeilenumbrüchen aufteilen und mehrmals aufrufen
fillText()
So etwas wie http://jsfiddle.net/BaG4J/1/
Ich habe gerade einen Wrapping Proof of Concept ( absoluter Wrap bei angegebener Breite. Noch kein Umgang mit Wörtern )
unter http://jsfiddle.net/BaG4J/2/ erstellt.
Und ein Zeilenumbruch ( bei Räumen zu brechen Proof of Concept).
Beispiel unter http://jsfiddle.net/BaG4J/5/
Im zweiten und dritten Beispiel verwende ich die
measureText()
Methode, die zeigt, wie lang ( in Pixel ) eine Zeichenfolge beim Drucken sein wird.quelle
Vielleicht komme ich etwas spät zu dieser Party, aber ich fand das folgende Tutorial zum Einwickeln von Text auf eine Leinwand perfekt.
http://www.html5canvastutorials.com/tutorials/html5-canvas-wrap-text-tutorial/
Von da an konnte ich denken, dass mehrere Leitungen funktionieren (sorry Ramirez, deine hat bei mir nicht funktioniert!). Mein vollständiger Code zum Umschließen von Text in eine Zeichenfläche lautet wie folgt:
Wo
c
ist die ID meiner Leinwand undtext
ist die ID meines Textfelds.Wie Sie wahrscheinlich sehen können, verwende ich eine nicht standardmäßige Schriftart. Sie können @ font-face verwenden, solange Sie die Schriftart für einen Text VOR der Bearbeitung der Zeichenfläche verwendet haben. Andernfalls nimmt die Zeichenfläche die Zeichenfläche nicht auf.
Hoffe das hilft jemandem.
quelle
Teilen Sie den Text in Zeilen und zeichnen Sie jede einzeln:
quelle
Hier ist meine Lösung: Ändern Sie die beliebte Funktion wrapText (), die hier bereits vorgestellt wird. Ich verwende die Prototyping-Funktion von JavaScript, damit Sie die Funktion aus dem Canvas-Kontext aufrufen können.
Grundlegende Verwendung:
Hier ist eine Demonstration, die ich zusammengestellt habe: http://jsfiddle.net/7RdbL/
quelle
Ich habe gerade den CanvasRenderingContext2D um zwei Funktionen erweitert: mlFillText und mlStrokeText.
Sie finden die letzte Version in GitHub :
Mit diesen Funktionen können Sie Miltiline-Text in ein Feld einfügen / streichen. Sie können den Text vertikal und horizontal ausrichten. (Es berücksichtigt \ n und kann auch den Text rechtfertigen).
Die Prototypen sind:
Funktion mlFillText (Text, x, y, w, h, vAlign, hAlign, Zeilenhöhe); Funktion mlStrokeText (Text, x, y, w, h, vAlign, hAlign, Zeilenhöhe);
Wo vAlign sein kann: "oben", "Mitte" oder "Schaltfläche" Und hAlign kann sein: "links", "Mitte", "rechts" oder "rechtfertigen"
Sie können die Bibliothek hier testen: http://jsfiddle.net/4WRZj/1/
Hier ist der Code der Bibliothek:
Und hier ist das Anwendungsbeispiel:
quelle
Uncaught ReferenceError: Words is not defined
Wenn ich versuche, die Schriftart zu ändern. Zum Beispiel:ctx.font = '40px Arial';
- versuchen Sie, das in Ihre Geige zuWords
(Groß- und Kleinschreibung) Variable? Es ist nirgendwo definiert. Dieser Teil des Codes wird nur ausgeführt, wenn Sie die Schriftart ändern.for in
dies mit Extended nicht gut funktioniertArray.prototype
. Könnten Sie es auf Github setzen, damit wir es wiederholen können?Mit Javascript habe ich eine Lösung entwickelt. Es ist nicht schön, aber es hat bei mir funktioniert:
Hoffentlich hilft das!
quelle
Der von @Gaby Petrioli bereitgestellte Code zum Umbrechen von Wörtern (Brechen an Leerzeichen) ist sehr hilfreich. Ich habe seinen Code erweitert, um Zeilenumbrüche zu unterstützen
\n
. Oft ist es auch nützlich, die Abmessungen des Begrenzungsrahmens zu haben, sodassmultiMeasureText()
sowohl die Breite als auch die Höhe zurückgegeben werden.Sie können den Code hier sehen: http://jsfiddle.net/jeffchan/WHgaY/76/
quelle
Hier ist eine Version von Colin,
wrapText()
die auch vertikal zentrierten Text unterstützt mitcontext.textBaseline = 'middle'
:quelle
Wenn Sie nur zwei Textzeilen benötigen, können Sie diese in zwei verschiedene fillText-Aufrufe aufteilen und jedem eine andere Grundlinie geben.
quelle
Diese Frage bezieht sich nicht darauf, wie Leinwand funktioniert. Wenn Sie einen Zeilenumbruch wünschen, passen Sie einfach die Koordinaten Ihres nächsten an
ctx.fillText
.quelle
Ich denke, Sie können sich immer noch auf CSS verlassen
Glücklicherweise können wir durch CSS-Hack-Ardry (siehe Typografische Metriken für weitere Möglichkeiten, ältere Implementierungen der Verwendung von CSS-Messungen zu korrigieren) die Höhe des Textes ermitteln, indem wir die offsetHeight von a mit denselben Schrifteigenschaften messen:
von: http://www.html5rocks.com/de/tutorials/canvas/texteffects/
quelle
ctx.save()
dann,ctx.font = '12pt Arial'
dann ,parseInt( ctx.font, 10 )
. Beachten Sie, dass ich beim Einstellen 'pt' verwende. Es wird dann in PX übersetzt und kann als Verbrauchshöhe in eine Ziffer für den Verbrauch umgewandelt werden.Ich habe hier eine winzige Bibliothek für dieses Szenario erstellt: Canvas-Txt
Es rendert Text mehrzeilig und bietet anständige Ausrichtungsmodi.
Um dies zu verwenden, müssen Sie es entweder installieren oder ein CDN verwenden.
Installation
JavaScript
Dadurch wird Text in einem unsichtbaren Feld mit folgenden Positionen / Abmessungen gerendert:
Beispiel Geige
quelle
ctx.fillText(txtline.trim(), textanchor, txtY)
ich dies nur in Ihrer interaktiven Demo auf Ihrer Website bemerkt.2.0.9
Version veröffentlicht. Die Demo-Site wird durch Aktualisieren der Paketversion behoben. Es gibt ein Problem mit mehreren Leerzeichen. Ich weiß nicht, ob es besser ist, ein Paket mit einer Meinung zu verwenden oder das Problem zu ignorieren. Ich habe Anfragen dafür von mehreren Orten erhalten. Ich ging voran und fügte trotzdem Trimm hinzu.Lorem ipsum dolor, sit <many spaces> amet
Das war der Grund, warum ich es überhaupt nicht getan habe. Was denkst du, sollte ich mehrere Leerzeichen berücksichtigen und nur entfernen, wenn es nur eines gibt?Ich denke auch nicht, dass dies möglich ist, aber eine Problemumgehung besteht darin, ein
<p>
Element zu erstellen und es mit Javascript zu positionieren.quelle
fillText()
undstrokeText()
Dinge tun können, die über das hinausgehen, was CSS kann.Ich bin darauf gestoßen, weil ich das gleiche Problem hatte. Ich arbeite mit variabler Schriftgröße, daher wird dies berücksichtigt:
Dabei ist .noteContent das inhaltsbearbeitbare Div, das der Benutzer bearbeitet hat (dies ist in jeder jQuery-Funktion verschachtelt), und ctx.font ist "14px Arial" (beachten Sie, dass die Pixelgröße an erster Stelle steht).
quelle
Das Canvas-Element unterstützt keine Zeichen wie Zeilenumbruch '\ n', Tab '\ t' oder <br /> -Tag.
Versuch es:
oder vielleicht mehrere Zeilen:
quelle
Meine ES5-Lösung für das Problem:
Weitere Informationen zu diesem Thema finden Sie in meinem Blog .
quelle