Calcular el tamaño del texto según el ancho del área de texto

Tengo un texto que se debe fijar a TextView con anchura especificada. Necesita calcular el tamaño del texto para que se ajuste a TextView.

En otras palabras: ¿Existe una manera de ajustar texto en el área de TextView, como la característica de tipo de escala ImageView?

Si es el tamaño del espacio que el texto toma después, entonces lo siguiente podría ayudar:

Paint paint = new Paint(); Rect bounds = new Rect(); int text_height = 0; int text_width = 0; paint.setTypeface(Typeface.DEFAULT);// your preference here paint.setTextSize(25);// have this the same as your text size String text = "Some random text"; paint.getTextBounds(text, 0, text.length(), bounds); text_height = bounds.height(); text_width = bounds.width(); 

Editar (después del comentario): Utilice lo anterior en sentido inverso:

 int text_height = 50; int text_width = 200; int text_check_w = 0; int text_check_h = 0; int incr_text_size = 1; boolean found_desired_size = true; while (found_desired_size){ paint.setTextSize(incr_text_size);// have this the same as your text size String text = "Some random text"; paint.getTextBounds(text, 0, text.length(), bounds); text_check_h = bounds.height(); text_check_w = bounds.width(); incr_text_size++; if (text_height == text_check_h && text_width == text_check_w){ found_desired_size = false; } } return incr_text_size; // this will be desired text size from bounds you already have 

// este método puede ser modificado un poco, pero te da una idea de lo que puedes hacer

Esta debe ser una solución simple:

 public void correctWidth(TextView textView, int desiredWidth) { Paint paint = new Paint(); Rect bounds = new Rect(); paint.setTypeface(textView.getTypeface()); float textSize = textView.getTextSize(); paint.setTextSize(textSize); String text = textView.getText().toString(); paint.getTextBounds(text, 0, text.length(), bounds); while (bounds.width() > desiredWidth) { textSize--; paint.setTextSize(textSize); paint.getTextBounds(text, 0, text.length(), bounds); } textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); } 

También tuve que enfrentar el mismo problema al tener que asegurar que el texto encaja en una caja específica. La siguiente es la solución más eficaz y precisa que tengo para ella en este momento:

 /** * A paint that has utilities dealing with painting text. * @author <a href="maillto:nospam">Ben Barkay</a> * @version 10, Aug 2014 */ public class TextPaint extends android.text.TextPaint { /** * Constructs a new {@code TextPaint}. */ public TextPaint() { super(); } /** * Constructs a new {@code TextPaint} using the specified flags * @param flags */ public TextPaint(int flags) { super(flags); } /** * Creates a new {@code TextPaint} copying the specified {@code source} state. * @param source The source paint to copy state from. */ public TextPaint(Paint source) { super(source); } // Some more utility methods... /** * Calibrates this paint's text-size to fit the specified text within the specified width. * @param text The text to calibrate for. * @param boxWidth The width of the space in which the text has to fit. */ public void calibrateTextSize(String text, float boxWidth) { calibrateTextSize(text, 0, Float.MAX_VALUE, boxWidth); } /** * Calibrates this paint's text-size to fit the specified text within the specified width. * @param text The text to calibrate for. * @param min The minimum text size to use. * @param max The maximum text size to use. * @param boxWidth The width of the space in which the text has to fit. */ public void calibrateTextSize(String text, float min, float max, float boxWidth) { setTextSize(10); setTextSize(Math.max(Math.min((boxWidth/measureText(text))*10, max), min)); } } 

Esto simplemente calcula el tamaño correcto en lugar de ejecutar una prueba / prueba de error.

Puedes usarlo así:

 float availableWidth = ...; // use your text view's width, or any other width. String text = "Hi there"; TextPaint paint = new TextPaint(Paint.ANTI_ALIAS_FLAG); paint.setTypeface(...); paint.calibrateTextSize(text, availableWidth); 

O de lo contrario, si desea entregar la basura:

 /** * Calibrates this paint's text-size to fit the specified text within the specified width. * @param paint The paint to calibrate. * @param text The text to calibrate for. * @param min The minimum text size to use. * @param max The maximum text size to use. * @param boxWidth The width of the space in which the text has to fit. */ public static void calibrateTextSize(Paint paint, String text, float min, float max, float boxWidth) { paint.setTextSize(10); paint.setTextSize(Math.max(Math.min((boxWidth/paint.measureText(text))*10, max), min)); } 

Utilizar así:

 float availableWidth = ...; // use your text view's width, or any other width. String text = "Hi there"; Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setTypeface(...); calibrateTextSize(paint, text, 0, Float.MAX_VALUE, availableWidth); 
  public static float getFitTextSize(TextPaint paint, float width, String text) { float nowWidth = paint.measureText(text); float newSize = (float) width / nowWidth * paint.getTextSize(); return newSize; } 
  • Enfocar el siguiente texto automáticamente
  • Cómo establecer dinámicamente altura de texto altura android
  • Palabra que se puede hacer clic en TextView en android
  • El texto de TextView desaparece cuando se gira el dispositivo
  • Alineación de la línea de base de dos vistas de texto en Android
  • ¿Qué es (s / g) etFreezesText en TextView?
  • Grados (como en Grados Celsius / Fahrenheit) en un TextView
  • No puede desplazar el ViewPager al tocar TextView (con android: gravity = "center") en él
  • Obtención de la altura de la vista de texto antes de la representación en el diseño
  • ¿Cómo obtengo el color de fondo de un TextView?
  • Necesita hacer que TextView se desplace verticalmente automáticamente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.