Existem diferentes maneiras de medir a altura, dependendo do que você precisa.
Se você está fazendo algo como centralizar com precisão uma pequena quantidade de texto fixo, provavelmente deseja getTextBounds
. Você pode obter o retângulo delimitador como este
Rect bounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
int height = bounds.height();
Como você pode ver nas imagens a seguir, cordas diferentes fornecerão alturas diferentes (mostradas em vermelho).

Essas alturas diferentes podem ser uma desvantagem em algumas situações em que você só precisa de uma altura constante, independentemente do texto. Veja a próxima seção.
Você pode calcular a altura da fonte a partir das métricas da fonte. A altura é sempre a mesma porque é obtida a partir da fonte, não de qualquer sequência de texto específica.
Paint.FontMetrics fm = mTextPaint.getFontMetrics();
float height = fm.descent - fm.ascent;
A linha de base é a linha em que o texto se localiza. A descida é geralmente a mais longe que um personagem vai abaixo da linha e a subida é geralmente a mais longe que um personagem fica acima da linha. Para obter a altura, você deve subtrair a subida, porque é um valor negativo. (A linha de base é y=0
e y
diminui a tela.)
Veja a seguinte imagem. As alturas para as duas cordas são 234.375
.

Se você deseja a altura da linha, e não apenas a altura do texto, faça o seguinte:
float height = fm.bottom - fm.top + fm.leading; // 265.4297
Estes são os bottom
e top
da linha. O início (espaçamento entre linhas) geralmente é zero, mas você deve adicioná-lo de qualquer maneira.
As imagens acima vêm deste projeto . Você pode brincar com ele para ver como as métricas de fonte funcionam.
Para medir a altura do texto com várias linhas, use a StaticLayout
. Eu falei sobre isso em detalhes nesta resposta , mas a maneira básica de obter essa altura é assim:
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();