Gibt es eine einfache Möglichkeit, die Höhe von Text zu messen? Die Art und Weise, wie ich es jetzt mache, besteht darin, mithilfe von Farben measureText()
die Breite zu ermitteln und dann durch Ausprobieren einen Wert zu finden, um eine ungefähre Höhe zu erhalten. Ich habe auch herumgespielt FontMetrics
, aber all dies scheinen ungefähre Methoden zu sein, die scheiße sind.
Ich versuche Dinge für verschiedene Auflösungen zu skalieren. Ich kann es schaffen, aber am Ende habe ich unglaublich ausführlichen Code mit vielen Berechnungen, um die relativen Größen zu bestimmen. Ich hasse es! Es muss einen besseren Weg geben.
android
graphics
view
android-canvas
Danedo
quelle
quelle
Es gibt verschiedene Möglichkeiten, die Höhe zu messen, je nachdem, was Sie benötigen.
getTextBounds
Wenn Sie so etwas wie eine kleine Menge festen Textes genau zentrieren, möchten Sie wahrscheinlich
getTextBounds
. Sie können das Begrenzungsrechteck wie folgt erhaltenWie Sie in den folgenden Bildern sehen können, ergeben unterschiedliche Zeichenfolgen unterschiedliche Höhen (rot dargestellt).
Diese unterschiedlichen Höhen können in einigen Situationen von Nachteil sein, wenn Sie nur eine konstante Höhe benötigen, unabhängig davon, um welchen Text es sich handelt. Siehe den nächsten Abschnitt.
Paint.FontMetrics
Sie können die Höhe der Schrift aus den Schriftmetriken berechnen. Die Höhe ist immer gleich, da sie aus der Schriftart und nicht aus einer bestimmten Textzeichenfolge stammt.
Die Grundlinie ist die Zeile, auf der sich der Text befindet. Der Abstieg ist im Allgemeinen am weitesten, wenn ein Charakter die Linie unterschreitet, und der Aufstieg ist im Allgemeinen am weitesten, wenn ein Charakter die Linie überschreitet. Um die Höhe zu erhalten, müssen Sie den Aufstieg subtrahieren, da dies ein negativer Wert ist. (Die Grundlinie ist
y=0
undy
verringert den Bildschirm.)Schauen Sie sich das folgende Bild an. Die Höhen für beide Saiten sind
234.375
.Wenn Sie die Zeilenhöhe und nicht nur die Texthöhe möchten, können Sie Folgendes tun:
Dies sind die
bottom
undtop
der Linie. Der führende (Zwischenzeilenabstand) ist normalerweise Null, aber Sie sollten ihn trotzdem hinzufügen.Die obigen Bilder stammen von diesem Projekt . Sie können damit herumspielen, um zu sehen, wie Schriftmetriken funktionieren.
StaticLayout
Zum Messen der Höhe von mehrzeiligem Text sollten Sie a verwenden
StaticLayout
. Ich habe in dieser Antwort ausführlich darüber gesprochen , aber der grundlegende Weg, um diese Höhe zu erreichen, ist folgender:quelle
getTextSize()
Sie die Schriftgröße in Pixeleinheiten (im Gegensatz zusp
Einheiten). @androiddeveloperDie Antwort von @ bramp ist richtig - teilweise insofern, als nicht erwähnt wird, dass die berechneten Grenzen das minimale Rechteck sind, das den Text vollständig mit impliziten Startkoordinaten von 0, 0 enthält.
Dies bedeutet, dass sich die Höhe von beispielsweise "Py" von der Höhe von "py" oder "hi" oder "oi" oder "aw" unterscheidet, da sie pixelweise unterschiedliche Höhen erfordern.
Dies entspricht keineswegs FontMetrics in klassischem Java.
Während die Breite eines Textes kein großer Schmerz ist, ist es die Höhe.
Wenn Sie den gezeichneten Text vertikal zentrieren möchten, versuchen Sie insbesondere, die Grenzen des Textes "a" (ohne Anführungszeichen) zu ermitteln, anstatt den Text zu verwenden, den Sie zeichnen möchten. Funktioniert bei mir...
Folgendes meine ich:
Vertikal zentrieren des Textes bedeutet, dass das Begrenzungsrechteck vertikal zentriert wird - was für verschiedene Texte (Großbuchstaben, lange Buchstaben usw.) unterschiedlich ist. Wir möchten aber auch die Basislinien der gerenderten Texte so ausrichten, dass sie nicht erhöht oder gerillt erscheinen. Solange wir also die Mitte des kleinsten Buchstabens kennen (z. B. "a"), können wir seine Ausrichtung für den Rest der Texte wiederverwenden. Dadurch werden alle Texte zentriert und an der Grundlinie ausgerichtet.
quelle
x >> 1
Ewigkeiten nicht mehr gesehen . Upvoting nur dafür :)x / 2
und optimierenx >> 1
x / 2
ist viel freundlicher beim Lesen von Code, wenn man Chris 'Kommentar berücksichtigt.buffer
in diesem Beispiel? Ist es diecanvas
an diedraw(Canvas)
Methode übergeben?Die Höhe ist die Textgröße, die Sie für die Paint-Variable festgelegt haben.
Eine andere Möglichkeit, die Höhe herauszufinden, ist
quelle
Sie können die
android.text.StaticLayout
Klasse verwenden, um die erforderlichen Grenzen anzugeben und dann aufzurufengetHeight()
. Sie können den Text (im Layout enthalten) zeichnen, indem Sie seinedraw(Canvas)
Methode aufrufen .quelle
Sie können die Textgröße für ein Paint-Objekt einfach mit der Methode getTextSize () abrufen. Beispielsweise:
quelle
24.0f
?Sie müssen verwenden
Rect.width()
undRect.Height()
welche vongetTextBounds()
stattdessen zurückgegeben. Das ist für mich in Ordnung.quelle
Wenn noch jemand ein Problem hat, ist dies mein Code.
Ich habe eine benutzerdefinierte Ansicht, die quadratisch ist (Breite = Höhe), und ich möchte ihr ein Zeichen zuweisen.
onDraw()
zeigt, wie man die Höhe des Charakters erreicht, obwohl ich es nicht benutze. Das Zeichen wird in der Mitte der Ansicht angezeigt.quelle