HTML5-Leinwand ctx.fillText wird keine Zeilenumbrüche machen?

73

Ich kann nicht in der Lage sein, Text zu einer Arbeitsfläche hinzuzufügen, wenn der Text "\ n" enthält. Ich meine, die Zeilenumbrüche zeigen nicht / arbeiten.

%Vor%

Der obige Code zeigt "s ome \n <br/> thing" in einer Zeile an.

Ist das eine Einschränkung von fillText oder mache ich es falsch? die "\ n" s sind dort und werden nicht gedruckt, aber sie funktionieren auch nicht.

    
Spectraljump 17.02.2011, 09:13
quelle

15 Antworten

45

Ich fürchte, es ist eine Einschränkung von Canvas 'fillText. Es gibt keine mehrzeilige Unterstützung. Was noch schlimmer ist, es gibt keine eingebaute Methode, um die Zeilenhöhe zu messen, sondern nur die Breite, was es noch schwieriger macht, es selbst zu machen!

Viele Leute haben ihre eigene mehrzeilige Unterstützung geschrieben, vielleicht ist das bemerkenswerteste Projekt Mozilla Skywriter .

Sie müssen mehrere fillText-Aufrufe ausführen, während Sie die Höhe des Textes jedes Mal zum y-Wert addieren. (Das Messen der Breite von M ist, was die Skywriter Leute tun, um Text zu approximieren, glaube ich.)

    
Simon Sarris 18.02.2011, 14:42
quelle
39

Wenn Sie sich nur um die Zeilenumbruchzeichen im Text kümmern möchten, können Sie es simulieren, indem Sie den Text an den Zeilenumbrüchen teilen und das fillText()

mehrfach aufrufen

Etwas wie Ссылка

%Vor% %Vor% %Vor%

Ich habe gerade einen Wrapping-Proof-of-Concept gemacht ( absoluter Zeilenumbruch in der angegebenen Breite. Keine handlungswörter brechen, ) Beispiel bei Ссылка

%Vor% %Vor% %Vor%

Und ein Wortumbruch ( breaking at spaces ), ein Proof of Concept.
Beispiel bei Ссылка

%Vor% %Vor% %Vor%

Im zweiten und dritten Beispiel verwende ich die measureText() -Methode, die zeigt, wie lang ( in Pixeln ) wird beim Ausdruck eine Zeichenfolge angezeigt.

    
Gaby aka G. Petrioli 18.12.2010 16:23
quelle
36

Vielleicht komme ich etwas spät zu dieser Party, aber ich fand das folgende Tutorial, um Text auf einer Leinwand perfekt zu verpacken.

Ссылка

Davon konnte ich denken, dass mehrere Zeilen funktionieren (sorry Ramirez, deine hat bei mir nicht funktioniert!). Mein vollständiger Code zum Umbrechen von Text in eine Zeichenfläche lautet wie folgt:

%Vor%

Dabei ist c die ID meiner Zeichenfläche und text ist die ID meiner Textbox.

Wie Sie wahrscheinlich sehen, verwende ich eine nicht standardmäßige Schriftart. Sie können @ font-face verwenden, solange Sie die Schriftart in einem Text PRIOR zum Bearbeiten der Zeichenfläche verwendet haben - andernfalls wird die Zeichenfläche nicht von der Zeichenfläche übernommen.

Hoffe das hilft jemandem.

    
Colin Wiseman 06.07.2012 12:10
quelle
18

Teilen Sie den Text in Zeilen auf und zeichnen Sie jedes getrennt:

%Vor%     
Rok Strniša 05.02.2014 10:26
quelle
17

Hier ist meine Lösung, indem ich die populäre wrapText () Funktion modifiziere, die hier bereits vorgestellt wurde. Ich verwende die Prototyping-Funktion von JavaScript, so dass Sie die Funktion aus dem Canvas-Kontext aufrufen können.

%Vor%

Grundlegende Verwendung:

%Vor%

Hier ist eine Demonstration, die ich zusammengestellt habe: Ссылка

    
Jake 21.07.2013 22:39
quelle
7

Der Code für den Zeilenumbruch (Leerzeichen), der von @ Gaby Petrioli ist sehr hilfreich. Ich habe seinen Code erweitert, um Unterstützung für Newline-Zeichen \n zu bieten. Oftmals ist es auch nützlich, die Abmessungen des Begrenzungsrahmens zu haben, sodass multiMeasureText() sowohl die Breite als auch die Höhe zurückgibt.

Sie können den Code hier sehen: Ссылка

    
jeffchan 11.08.2011 16:56
quelle
7

Mit Javascript habe ich eine Lösung entwickelt. Es ist nicht schön, aber es hat für mich funktioniert:

%Vor%

Hoffe das hilft!

    
Ramirez 01.11.2011 23:52
quelle
7

Ich habe gerade den CanvasRenderingContext2D um zwei Funktionen erweitert: mlFillText und mlStrokeText.

Sie können die letzte Version in GitHub finden:

Mit diesen Funktionen können Sie Text in eine Box füllen / streichen. Sie können den Text vertikal und horizontal ausrichten. (Es nimmt account \ n's 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: "top", "center" oder "button" Und hAlign kann sein: "links", "zentriert", "rechts" oder "rechtfertigen"

Sie können die Lib hier testen: Ссылка

Hier ist der Code der Bibliothek:

%Vor%

Und hier ist das Anwendungsbeispiel:

%Vor%     
jbaylina 21.02.2013 09:54
quelle
4

Hier ist eine Version von Colins wrapText() , die auch vertikal zentrierten Text mit context.textBaseline = 'middle' :

unterstützt %Vor%     
Tom Söderlund 09.05.2015 07:19
quelle
3

Ich denke, Sie können sich immer noch auf CSS verlassen

%Vor%

Glücklicherweise können wir die Höhe des Textes durch CSS-Hack-ardry (sieheTypographische Metriken für mehr Möglichkeiten, um ältere Implementierungen von CSS-Messungenzu korrigieren) durch Messen der offsetHeight von a mit den gleichen Font-Eigenschaften finden:

%Vor%

von: Ссылка

    
MarioF 29.05.2012 21:41
quelle
2

Ich denke nicht, dass dies auch nicht möglich ist, aber ein Workaround dafür ist, ein <p> -Element zu erstellen und es mit Javascript zu positionieren.

    
Harmen 18.12.2010 16:00
quelle
2

Ich passierte darüber, weil ich das gleiche Problem hatte. Ich arbeite mit variabler Schriftgröße, das berücksichtigt das:

%Vor%

Dabei ist .noteContent das zufriedengestellte div, das der Benutzer bearbeitet hat (dies ist in einer jQuery-Funktion verschachtelt), und ctx.font ist "14px Arial" (beachten Sie, dass die Pixelgröße zuerst kommt)

    
MaKR 04.09.2013 21:49
quelle
0

Das Canvas-Element unterstützt keine Zeichen wie Newline '\ n', Tab '\ t' oder & lt; br / & gt; Tag.

Probieren Sie es aus:

%Vor%

oder vielleicht mehrere Zeilen:

%Vor%     
Dariusz J 03.11.2012 19:08
quelle
0

Meine ES5-Lösung für das Problem:

%Vor%

Weitere Informationen zum Thema finden Sie in meinem Blog .

    
Oleg Berman 12.05.2016 16:27
quelle
0

Wenn Sie nur zwei Textzeilen benötigen, können Sie sie in zwei unterschiedliche fillText-Aufrufe aufteilen und ihnen jeweils eine andere Grundlinie zuweisen.

%Vor%     
thingEvery 12.02.2018 04:06
quelle

Tags und Links