Ich arbeite gerade daran, eine Bitmap zu rendern, die ich dann an einen mobilen Drucker senden möchte. Ich bemühe mich jedoch, die Höhe meines Textes zu messen, damit ich die y-Position entsprechend vorrücken kann.
Meine grundlegende Bitmap / Canvas / Paint-Konfiguration ist dies (Schriftgröße ist 16 und die Abmessungen der Bitmap sind 200x400 (Breite x Höhe):
%Vor%So weit, so gut, was ich jetzt machen möchte: Wenn ich die Methode drawText von Paint verwende, muss ich die x- und y-Koordinaten angeben. Wie für x, das Null ist (vorausgesetzt linksbündig Text) aber wie für y, ich müsste die Höhe jedes Textes, den ich drucke, berechnen und addieren, so dass ich meine aktuelle y-Position verfolgen kann.
Und hier wird es seltsam: Ich benutze die folgende Methode, um die Höhe eines Textes zu bestimmen (unter Verwendung des Paint-Objekts, das ich zuvor initialisiert habe - es heißt "Pinsel"):
%Vor%Die obige Methode gibt die folgenden Werte für die folgenden Texte zurück:
Es macht Sinn für mich, dass Nummer 2 und 3 eine größere Höhe als Nummer 1 zurückgeben, aber wenn eine Zeile eine Höhe von 12 hat (wie Nummer eins tut) - es macht keinen Sinn, dass mehrere Zeilen eine Höhe von 16 haben ?
Fehle ich hier etwas? Es gibt eine bequeme Methode, um die Breite eines Textes zu messen (mit einer Instanz von Paint und Call MeasureText ("myText"), die perfekt funktioniert, aber ich bin ziemlich ratlos, wenn es um die Höhe geht, wie die oben angegebenen Ergebnisse ergibt keinen Sinn für mich.
BEARBEITEN
Ich bin mir bewusst, dass getTextBounds wahrscheinlich keinen mehrzeiligen Text automatisch umschließt, und das ist in Ordnung, ich habe bereits eine Methode zum Teilen von Text geschrieben, aber selbst wenn es nur eine Zeile misst, scheinen die oben angegebenen Längenwerte immer noch unwahrscheinlich.
Ich denke, das liegt daran, dass das "p" in "compute" unterhalb der Grundlinie liegt, während "Hello World" nur Buchstaben enthält, die über der Grundlinie liegen.
Da der Zeilenabstand nicht davon abhängen sollte, aus welchen Buchstaben Ihr Text zufällig besteht, suchen Sie wahrscheinlich nach Paint.FontMetrics , die über Paint.getFontMetrics abgerufen werden können () . Berechne descent - ascent + leading
, um den empfohlenen Basislinienabstand zu erhalten (weil der Aufstieg einen negativen Wert hat).
Es gibt einen kleinen Fehler in der angenommenen Antwort. Wenn Sie die Höhe text möchten, sollten Sie
verwenden %Vor%Und wenn Sie die Zeile Höhe möchten, sollten Sie
verwenden %Vor%Leading ist ein optionaler Interline-Abstand. Wenn Sie also die Zeilenhöhe erreichen möchten, können Sie sie einfügen. Aber wenn Sie nur die Texthöhe möchten, dann können Sie es abstellen.
Hinweis
leading
gesehen, außer 0
, und soweit ich das beurteilen kann, scheint es sogar ignoriert zu werden in TextView
quelle code (und die zugehörige Layout
, StaticLayout
usw.). Bitte korrigieren Sie mich, falls ich falsch liege. Es ist also wahrscheinlich sicher, dass es keine Line-High-Berechnungen gibt, aber ich bin mir da nicht ganz sicher. Siehe auch
Tags und Links android android-canvas paint