Android: Texthöhe in einem Canvas messen

8

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:

  1. " Hallo Welt " gibt eine Höhe von 12 zurück
  2. " Eine Kamera-Instanz kann verwendet werden, um 3D-Transformationen zu berechnen und eine Matrix zu generieren. " gibt eine Höhe von 16 zurück
  3. " Einführung in Android Design: Hier erfahren Sie mehr über Prinzipien, Bausteine ​​und Muster für die Erstellung erstklassiger Android-Benutzeroberflächen. Ob Sie ein UI-Profi sind oder ein Entwickler, der diese Rolle spielt, zeigen Ihnen diese Dokumente wie man große und kleine Designentscheidungen trifft. "gibt eine Höhe von 16 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.

    
AgentKnopf 20.02.2012, 16:22
quelle

2 Antworten

16

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).

    
devconsole 20.02.2012, 17:09
quelle
4

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

  • Ich habe nie 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

Suragch 07.02.2017 02:41
quelle

Tags und Links