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"); 
  • Detectar si TextView en ListView está ellipsizado
  • Cómo cambiar el texto de textView de fragmento de la actividad
  • Puedo cambiar el aspecto y la sensación de la clickablespan
  • Cómo enlazar Android TextView a evento Click con MvvmCross
  • Establecer una cadena spannable no funciona en una simple Textview
  • ¿Cómo puedo probar por Espresso android.widget.TextView setError?
  • ¿Hay de todos modos hacer automáticamente un TextView ir a una nueva línea después de una cierta cantidad de caracteres?
  • Cómo configurar unicode en textview para mostrar emoji en android?
  • Android: No se puede utilizar android.R.drawable como imagen de fondo para textview
  • TextView con color de fondo y espaciado entre líneas
  • Android scroll down
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.