Android: Medir la altura del texto en una lona

Actualmente estoy trabajando en la prestación de un mapa de bits, que luego desea enviar a una impresora móvil. Sin embargo, estoy luchando con medir la altura de mi texto, así que puedo avanzar la posición de y apropiadamente.

Mi configuración básica de mapa de bits / lienzo / pintura es ésta (Tamaño de fuente es 16 y las dimensiones del mapa de bits son 200×400 (anchura x altura):

public MyRenderer() { // Initialize bitmap bitmap = Bitmap.createBitmap(200, 400, Bitmap.Config.ARGB_8888); // Initialize canvas canvas = new Canvas(bitmap); // Initialize brush (Paint instance) brush = new Paint(); brush.setTextSize(16); brush.setTypeface(Typeface.SANS_SERIF); brush.setColor(Color.BLACK); brush.setStyle(Paint.Style.FILL); brush.setAntiAlias(true); brush.setTextAlign(Align.LEFT); } 

Hasta ahora tan bueno, ahora lo que quiero hacer es: Si utilizo el método de Paint drawText necesito proporcionar las coordenadas xey. En cuanto a x que es cero (suponiendo que el texto alineado a la izquierda), pero como para y, tendría que calcular la altura de cada texto que imprimo y sumarlo, para que pueda realizar un seguimiento de mi posición y actual.

Y aquí es donde se vuelve extraño: estoy usando el siguiente método para determinar la altura de un texto (usando la pintura objeted que inicialmente había llamado anteriormente "pincel"):

 public int measureHeight(String text) { Rect result = new Rect(); // Measure the text rectangle to get the height brush.getTextBounds(text, 0, text.length(), result); return result.height(); } 

El método anterior devuelve los siguientes valores para los siguientes textos:

  1. " Hello World " devuelve una altura de 12
  2. " Una instancia de cámara se puede utilizar para calcular transformaciones 3D y generar una matriz. " Devuelve una altura de 16
  3. " Introducción a Android Design: el lugar para aprender sobre los principios, bloques de construcción y patrones para crear interfaces de usuario de nivel mundial de Android. Si usted es un profesional de la interfaz de usuario o un desarrollador que desempeña ese papel, estos documentos le muestran cómo tomar buenas decisiones de diseño , Grande y pequeño. "Devuelve una altura de 16

Tiene sentido para mí que los números 2 y 3 devuelvan una altura mayor que el número 1, pero si una línea tiene una altura de 12 (como hace el número uno) – no tiene sentido que varias líneas tengan una altura de 16?

¿Me estoy perdiendo de algo? Hay un método de conveniencia para medir el ancho de un texto (usando una instancia de pintura y llamada measureText ("myText") que funciona perfectamente, sin embargo estoy bastante en una pérdida, cuando se trata de la altura, como los resultados anteriores No tienen ningún sentido para mí.

EDITAR

Soy consciente, que getTextBounds probablemente no envuelve automáticamente el texto de múltiples líneas, y eso está bien, ya escribí un método para dividir el texto, pero incluso si sólo mide una línea, los valores de longitud dada anteriormente parecen improbables.

2 Solutions collect form web for “Android: Medir la altura del texto en una lona”

Creo que es porque el "p" en "calcular" se extiende por debajo de la línea de base, mientras que "Hello World" sólo contiene letras que están por encima de la línea de base.

Puesto que la distancia de la línea no debe depender de qué letras específicas su texto pasa a consistir de usted está buscando probablemente Paint.FontMetrics que se puede obtener vía Paint.getFontMetrics () . Calcule el descent - ascent + leading para obtener la distancia de referencia recomendada (porque el ascenso tiene un valor negativo).

Hay un pequeño error en la respuesta aceptada. Si desea que la altura del texto , debe utilizar

 Paint.FontMetrics fm = mTextPaint.getFontMetrics(); float textHeight = fm.descent - fm.ascent; 

Y si quieres la altura de la línea , debes usar

 float lineHeight = fm.bottom - fm.top + fm.leading; 

Liderando es el espaciado interline opcional, así que si necesita obtener la línea alta puede incluirlo. Pero si sólo desea la altura del texto, entonces usted puede dejarlo.

Nota

  • En realidad, nunca he visto ser nada más que 0 , y por lo que puedo decir que incluso parece ser ignorado en el código fuente TextView (y su asociado Layout , StaticLayout , etc). Por favor, corrija si estoy equivocado. Por lo tanto, es probablemente seguro que lo deje fuera de línea calificaciones hight, pero no estoy completamente seguro acerca de eso.

Ver también

  • Obtener altura de texto de getTextBounds vs FontMetrics vs StaticLayout
  • Significado de top, ascent, baseline, descent, bottom y leading en FontMetrics de Android
  • ¿Cómo dibujo texto en negrita en un mapa de bits?
  • Opacidad incremental, que desea una opacidad constante Vista de imagen con Drawable
  • Cepillo personalizado de Android
  • Cómo obtener el ancho del texto cuando el ajuste de varios spannable
  • Captura de pantalla
  • Cómo llenar el color en la imagen en el área en particular?
  • Android conjunto de la fuente personalizada a una pintura
  • ¿Cómo aplicar el color del pincel con puntos en la aplicación Paint android?
  • Dibujo sobre lienzo y varios objetos de pintura
  • Android FingerPaint Deshacer / Rehacer la implementación
  • Cómo dibujar texto con diferentes trazos y colores de relleno?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.