Eine hoffentlich schnelle Frage, aber ich kann anscheinend keine Beispiele finden ... Ich möchte mehrzeiligen Text View
über a in einen Benutzer schreiben Canvas
, und in habe onDraw()
ich:
...
String text = "This is\nmulti-line\ntext";
canvas.drawText(text, 100, 100, mTextPaint);
...
Ich hatte gehofft, dass dies zu Zeilenumbrüchen führen würde, aber stattdessen sehe ich kryptische Zeichen, wo das sein \n
würde.
Alle Hinweise geschätzt.
Paul
android
android-canvas
Paul Mennega
quelle
quelle
Layout
anstattCanvas.drawText
direkt anzurufen . Diese Fragen und Antworten zeigen, wie Sie mit aStaticLayout
mehrzeiligen Text zeichnen.Antworten:
Leider weiß Android nicht was
\n
ist. Was Sie tun müssen, ist\n
das Y zu entfernen und dann das Y zu versetzen, um Ihren Text in die nächste Zeile zu bekommen. Also so etwas wie das:quelle
drawText()
?Ich habe einen anderen Weg gefunden, statische Layouts zu verwenden. Der Code ist für jedermann zugänglich:
quelle
canvas.getWidth()
sollte wirklich seingetWidth() - getPaddingLeft() - getPaddingRight()
, um die Auffüllung der Ansicht zu berücksichtigen. Beachten Sie außerdem, dass Sie das StaticLayout nur berechnen können, wenn sich Ihr Text oder Ihre Ansichtsgröße ändert, und zeichnen Sie es, ohne ein neues zu erstellen, was wahrscheinlich besser ist!Durchlaufen Sie einfach jede Zeile:
quelle
Ich habe ein vollständiges Beispiel geschrieben
Farben.xml
Java-Klasse
quelle
int noOfLines = gText.split("\n").length
Dies ist meine Lösung, die auf @ Daves Antwort basiert (danke übrigens ;-))
Ich habe versucht, Canvas zu erben, aber es lässt dich nicht wirklich. Das ist also eine Zwischenklasse!
quelle
Ich muss hier meine Version hinzufügen, die auch STROKE WIDTH berücksichtigt.
quelle
es wird klappen. Ich habe getestet
Quelle: http://www.skoumal.net/de/android-drawing-multiline-text-on-bitmap/
quelle
Ja. Verwenden Sie
canvas.getFontSpacing()
als Inkrement. Ich habe es selbst aus Neugier versucht und es funktioniert für jede Schriftgröße.quelle
Versuche dies
quelle
Ich habe die von GreenBee vorgeschlagene Lösung erneut verwendet und eine Funktion zum Zeichnen von mehrzeiligem Text in bestimmte Grenzen mit dem "..." am Ende erstellt, wenn ein Abschneiden aufgetreten ist:
quelle
Lösung ohne StaticLayout
quelle
Ich arbeitete mit dem, was ich hatte, das bereits einzelne Zeilen in Leinwände umwandelte, und ich arbeitete Lumis 'Antwort ab, und am Ende kam ich dazu. 1.3 und 1.3f sind als Auffüllung zwischen Zeilen im Verhältnis zur Schriftgröße gedacht.
quelle
Ich hatte ein ähnliches Problem. aber ich sollte den Pfad des Textes zurückgeben. Sie können diesen Pfad auf Leinwand zeichnen. Das ist mein Code. Ich benutze Break Text. und path.op
und um textgebundenen Text zu finden, habe ich diese Funktion verwendet
quelle
Für Kotlin-Benutzer. Mehrzeiliger Text kann mit StaticLayout erstellt werden . Hier finden Sie eine gute Erklärung und wie Sie sie als Erweiterungsfunktion verwenden können. https://medium.com/over-engineering/drawing-multiline-text-to-canvas-on-android-9b98f0bfa16a
quelle
Zusätzlich zum Zeichnen von mehrzeiligem Text kann es schwierig sein, die mehrzeiligen Textgrenzen zu ermitteln (z. B. um sie auf Leinwand auszurichten).
Standard
paint.getTextBounds()
funktioniert in diesem Fall nicht, da die einzige Zeile gemessen wird.Der Einfachheit halber habe ich diese beiden Erweiterungsfunktionen erstellt: eine zum Zeichnen von mehrzeiligem Text und die andere zum Abrufen von Textgrenzen.
So einfach ist das jetzt: Zum Zeichnen von mehrzeiligem Text:
Zum Messen von Text:
val bounds = yourPaint.getTextBoundsMultiLine (Text)
In diesem Fall wird der gesamte Text vom Anfang bis zum Ende und unter Verwendung der Standardeinstellung für einmal zugewiesenes (veränderbares) Rechteck gemessen.
Sie können mit der Übergabe zusätzlicher Parameter für zusätzliche Flexibilität herumspielen.
quelle
Mein Beispiel mit dynamischer Textgröße und -abstand funktioniert hervorragend für mich ...
quelle