¿Alguna forma directa de medir la altura del texto? La forma en que lo estoy haciendo ahora es usando Paint measureText()
para obtener el ancho, luego, por prueba y error, encontrar un valor para obtener una altura aproximada. También he estado jugando FontMetrics
, pero todos estos parecen métodos aproximados que apestan.
Estoy tratando de escalar cosas para diferentes resoluciones. Puedo hacerlo, pero termino con un código increíblemente detallado con muchos cálculos para determinar los tamaños relativos. ¡Lo odio! Tiene que haber una mejor manera.
android
graphics
view
android-canvas
Danedo
fuente
fuente
Existen diferentes formas de medir la altura según lo que necesite.
getTextBounds
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 esteComo 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.
Paint.FontMetrics
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.
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
yy
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:
Estos son los
bottom
ytop
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.
StaticLayout
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:fuente
getTextSize()
da el tamaño de fuente en unidades de píxeles (en oposición a lassp
unidades). @androiddeveloperLa respuesta de @ bramp es correcta, en parte, ya que no menciona que los límites calculados serán el rectángulo mínimo que contiene el texto completamente con coordenadas de inicio implícitas de 0, 0.
Esto significa que la altura de, por ejemplo, "Py" será diferente de la altura de "py" o "hi" u "oi" o "aw" porque en cuanto a píxeles requieren diferentes alturas.
Esto de ninguna manera es equivalente a FontMetrics en Java clásico.
Mientras que el ancho de un texto no es un gran problema, la altura sí lo es.
En particular, si necesita alinear verticalmente al centro del texto dibujado, intente obtener los límites del texto "a" (sin comillas), en lugar de utilizar el texto que desea dibujar. Funciona para mi...
Esto es lo que quiero decir:
Alinear verticalmente al centro del texto significa alinear verticalmente al centro del rectángulo delimitador, que es diferente para diferentes textos (mayúsculas, letras largas, etc.). Pero lo que realmente queremos hacer es alinear también las líneas de base de los textos renderizados, de modo que no parezcan elevados o acanalados. Por lo tanto, siempre que conozcamos el centro de la letra más pequeña ("a", por ejemplo), podemos reutilizar su alineación para el resto de los textos. Esto centrará la alineación de todos los textos, así como la alineación de referencia.
fuente
x >> 1
en mucho tiempo. Upvoting solo por eso :)x / 2
y optimizará parax >> 1
x / 2
es mucho más amigable cuando lee el código, considerando el comentario de Chris.buffer
en este ejemplo? ¿Es elcanvas
pasado aldraw(Canvas)
método?La altura es el tamaño de texto que ha establecido en la variable Paint.
Otra forma de averiguar la altura es
fuente
Puede usar la
android.text.StaticLayout
clase para especificar los límites requeridos y luego llamargetHeight()
. Puede dibujar el texto (contenido en el diseño) llamando a sudraw(Canvas)
método.fuente
Simplemente puede obtener el tamaño de texto para un objeto Paint usando el método getTextSize (). Por ejemplo:
fuente
24.0f
viene el?Debe usar
Rect.width()
yRect.Height()
que regresó de en sugetTextBounds()
lugar. Funciona para mi.fuente
Si alguien todavía tiene problemas, este es mi código.
Tengo una vista personalizada que es cuadrada (ancho = alto) y quiero asignarle un carácter.
onDraw()
muestra cómo obtener la altura del personaje, aunque no lo estoy usando. El personaje se mostrará en el medio de la vista.fuente