Existen diferentes formas de medir la altura según lo que necesite.
Si está haciendo algo como centrar con precisión una pequeña cantidad de texto fijo, probablemente lo desee getTextBounds
. Puedes obtener el rectángulo delimitador como este
Rect bounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
int height = bounds.height();
Como puede ver en las siguientes imágenes, diferentes cadenas darán diferentes alturas (se muestran en rojo).
Estas alturas diferentes podrían ser una desventaja en algunas situaciones en las que solo necesita una altura constante sin importar el texto. Ver la siguiente sección.
Puede calcular la altura de la fuente a partir de las métricas de la fuente. La altura es siempre la misma porque se obtiene de la fuente, no de una cadena de texto en particular.
Paint.FontMetrics fm = mTextPaint.getFontMetrics();
float height = fm.descent - fm.ascent;
La línea de base es la línea en la que se encuentra el texto. El descenso es generalmente lo más lejos que un personaje irá debajo de la línea y el ascenso es generalmente lo más lejos que un personaje irá por encima de la línea. Para obtener la altura hay que restar el ascenso porque es un valor negativo. (La línea base es y=0
y y
disminuye la pantalla).
Mira la siguiente imagen. Las alturas para ambas cuerdas son 234.375
.
Si desea la altura de la línea en lugar de solo la altura del texto, puede hacer lo siguiente:
float height = fm.bottom - fm.top + fm.leading; // 265.4297
Estos son los bottom
y top
de la línea. El inicio (espacio interlineal) suele ser cero, pero debe agregarlo de todos modos.
Las imágenes de arriba provienen de este proyecto . Puedes jugar con él para ver cómo funcionan las métricas de fuentes.
Para medir la altura del texto de varias líneas, debe usar a StaticLayout
. Hablé sobre ello con cierto detalle en esta respuesta , pero la forma básica de obtener esta altura es la siguiente:
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();