Hay diferentes maneras de medir la altura en función de lo que necesita.
Si usted está haciendo algo así como el centrado, precisamente, una pequeña cantidad de texto fijo, es probable que quieren getTextBounds
. Usted puede obtener el rectángulo delimitador como esto
Rect bounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
int height = bounds.height();
Como se puede ver por las siguientes imágenes, diferentes cadenas darán diferentes alturas (en rojo).
Estas alturas diferentes podrían ser una desventaja en algunas situaciones en las que sólo tiene una altura constante independientemente de lo que el texto es. Ver la siguiente sección.
se puede calcular la altura de la fuente de las medidas de 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 generalmente es lo más lejos que un personaje irá por debajo de la línea y el ascenso generalmente es lo más lejos que un personaje irá por encima de la línea. Para obtener la altura, debes restar el ascenso porque es un valor negativo. (La línea base es y=0
y y
descrece en la pantalla.)
Mire la siguiente imagen. Las alturas para ambas cadenas son 234.375
.
Si desea que la altura de la línea en lugar de sólo la altura del texto, se 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 principal (espaciado entre líneas) es generalmente cero, pero debe agregarlo de todos modos.
Las imágenes de arriba provienen de this project. Puedes jugar con él para ver cómo funciona Font Metrics.
Para medir la altura de texto de varias líneas se debe utilizar un StaticLayout
. Hablé de ello con cierto detalle en this answer, pero la forma básica para 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();
Esto produce resultados muy extraños, cuando evalúo la altura de un texto. Un texto corto da como resultado una altura de 12, mientras que un texto REALMENTE largo da como resultado una altura de 16 (dado un tamaño de letra de 16). No tiene sentido para mí (android 2.3.3) – AgentKnopf
La varianza en altura es donde tienes descendentes en el texto, es decir'Alto' es más alto que 'Bajo' debido a la parte del g debajo de la línea – FrinkTheBrave