Es gibt verschiedene Möglichkeiten, die Höhe zu messen, je nachdem, was Sie benötigen.
Wenn Sie so etwas wie eine kleine Menge festen Textes genau zentrieren, möchten Sie wahrscheinlich getTextBounds
. Sie können das Begrenzungsrechteck wie folgt erhalten
Rect bounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
int height = bounds.height();
Wie 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.
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.
Paint.FontMetrics fm = mTextPaint.getFontMetrics();
float height = fm.descent - fm.ascent;
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
und y
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:
float height = fm.bottom - fm.top + fm.leading; // 265.4297
Dies sind die bottom
und top
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.
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:
String text = "This is some text. This is some text. This is some text. This is some text. This is some text. This is some text.";
TextPaint myTextPaint = new TextPaint();
myTextPaint.setAntiAlias(true);
myTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
myTextPaint.setColor(0xFF000000);
int width = 200;
Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
float spacingMultiplier = 1;
float spacingAddition = 0;
boolean includePadding = false;
StaticLayout myStaticLayout = new StaticLayout(text, myTextPaint, width, alignment, spacingMultiplier, spacingAddition, includePadding);
float height = myStaticLayout.getHeight();