Istnieją różne sposoby pomiaru wysokości w zależności od potrzeb.
Jeśli robisz coś takiego jak precyzyjne wyśrodkowanie niewielkiej ilości stałego tekstu, prawdopodobnie chcesz getTextBounds
. Możesz uzyskać prostokąt ograniczający w ten sposób
Rect bounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
int height = bounds.height();
Jak widać na poniższych obrazkach, różne struny będą miały różne wysokości (pokazane na czerwono).
Te różne wysokości mogą być wadą w niektórych sytuacjach, gdy potrzebna jest po prostu stała wysokość bez względu na tekst. Zobacz następną sekcję.
Możesz obliczyć wysokość czcionki na podstawie metryk czcionki. Wysokość jest zawsze taka sama, ponieważ jest pobierana z czcionki, a nie z konkretnego ciągu tekstowego.
Paint.FontMetrics fm = mTextPaint.getFontMetrics();
float height = fm.descent - fm.ascent;
Linia bazowa to linia, na której znajduje się tekst. Zejście jest na ogół najdalej, na jaką postać znajdzie się poniżej linii, a wzniesienie jest na ogół najdalej, na jaką postać znajdzie się nad linią. Aby uzyskać wysokość, musisz odjąć wzrost, ponieważ jest to wartość ujemna. (Linia bazowa jest y=0
i y
zmniejsza się w górę ekranu).
Spójrz na poniższy obraz. Wysokości obu strun to 234.375
.
Jeśli chcesz mieć wysokość wiersza, a nie tylko wysokość tekstu, możesz wykonać następujące czynności:
float height = fm.bottom - fm.top + fm.leading;
To są bottom
i top
linii. Początek (odstępy między wierszami) są zwykle równe zero, ale mimo to należy je dodać.
Powyższe obrazy pochodzą z tego projektu . Możesz się nim bawić, aby zobaczyć, jak działają wskaźniki czcionki.
Aby zmierzyć wysokość tekstu wielowierszowego, należy użyć rozszerzenia StaticLayout
. Mówiłem o tym szczegółowo w tej odpowiedzi , ale podstawowy sposób uzyskania tej wysokości jest taki:
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();