Cómo obtener rápidamente el ancho y la altura de TextView utilizando Paint.getTextBounds ()?

Hay un método en la clase Paint: Paint.getTextBounds () que devuelve Rect ocupado por algún texto. Pero de acuerdo con esta respuesta devuelve algo diferente, a continuación, ancho / alto de TextView.

Q1: ¿Hay una manera de obtener el ancho y la altura de TextView utilizando Rect devuelto por Paint.getTextBounds () ?

Tenga en cuenta, necesito saber ancho / altura con precisión. Estaré encantado de saber el límite superior de la rect con un posible error de 2-3%, pero no debe ser mayor (y debería funcionar para cualquier teléfono que no depende de la resolución de la pantalla y la densidad de píxeles), a continuación, TextView límites

P2: ¿Hay algún otro método RÁPIDO de determinar el ancho y la altura de algún texto con textSize especificado?

Yo sé, el ancho puede ser determinado por Paint.measureText () , pero esto no devuelve la altura. La altura se puede determinar creando nuevo StaticLayout con texto y luego llamando a StaticLayout.getHeight () , pero esto es demasiado lento. Necesito algo más rápido.


El fondo para todo esto es hacer AutoFitTextView que se ajustará automáticamente el texto dentro de sus límites por arriba o abajo de escala de tamaño de texto, y debe hacer esto rápidamente, ya que habrá muchos de tales AutoFitTextView s cambiado dinámicamente muy rápidamente.

2 Solutions collect form web for “Cómo obtener rápidamente el ancho y la altura de TextView utilizando Paint.getTextBounds ()?”

Encontró un método sencillo y no lento de determinar el ancho / altura del texto dibujado con Paint específico que no utiliza StaticLayout .

 public int getTextWidth(String text, Paint paint) { Rect bounds = new Rect(); paint.getTextBounds(text, 0, text.length(), bounds); int width = bounds.left + bounds.width(); return width; } public int getTextHeight(String text, Paint paint) { Rect bounds = new Rect(); paint.getTextBounds(text, 0, text.length(), bounds); int height = bounds.bottom + bounds.height(); return height; } 

La breve descripción simple del truco: Paint.getTextBounds(String text, int start, int end, Rect bounds) devuelve Rect que no comienza en (0,0) . Es decir, para obtener el ancho real de texto que se establecerá llamando a Canvas.drawText(String text, float x, float y, Paint paint) con el mismo objeto Paint de getTextBounds() debe agregar la posición izquierda de Rect .

Observe esto bounds.left – esta es la clave del problema.

De esta manera, recibirá el mismo ancho de texto que recibirá con Canvas.drawText() .


En esta respuesta se da una explicación mucho más detallada.

Con java utilicé la clase FontMetrics.

 Font f= new Font("Arial", Font.BOLD, 16); FontMetrics metric = getFontMetrics(f); metric.stringWidth("the text I want to measure"); 
  • Android- Ajusta el ancho de un TextView a la izquierda de cualquier botón-1 o botón-2
  • No se puede inflar correctamente el diseño de un fragmento en la aplicación de Android
  • Android: conversión entre cadenas, SpannedStrings y Spannablestrings
  • El texto largo pasa a la siguiente línea en ICS, pero no en GB y debajo
  • Tools: text para artículos de RecyclerView
  • Cómo almacenar texto largo en Android?
  • TextView con diferentes textSize
  • ¿Cómo auto-ajustar el tamaño del texto en un TextView multi-línea de acuerdo con la vista de las dimensiones máximas?
  • ¿Qué es TextView Gravity de forma predeterminada?
  • Cómo configurar unicode en textview para mostrar emoji en android?
  • ¿Cómo evitar OutOfMemory para TextView que contiene ilimitado ImageSpans?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.