¿Hay alguna manera en Android para ajustar el tamaño del texto en una vista de texto para que se ajuste al espacio que ocupa?
Por ejemplo, estoy usando a TableLayout
y agrego varios TextView
s a cada fila. Como no quiero que los TextView
s envuelvan el texto, prefiero ver que reduce el tamaño de fuente del contenido.
¿Algunas ideas?
Lo he intentado measureText
, pero como no sé el tamaño de la columna, parece problemático de usar. Este es el código donde quiero cambiar el tamaño de fuente a algo que se ajuste
TableRow row = new TableRow(this);
for (int i=0; i < ColumnNames.length; i++) {
TextView textColumn = new TextView(this);
textColumn.setText(ColumnNames[i]);
textColumn.setPadding(0, 0, 1, 0);
textColumn.setTextColor(getResources().getColor(R.drawable.text_default));
row.addView(textColumn, new TableRow.LayoutParams());
}
table.addView(row, new TableLayout.LayoutParams());
Respuestas:
La solución a continuación incorpora todas las sugerencias aquí. Comienza con lo publicado originalmente por Dunni. Utiliza una búsqueda binaria como la de gjpc, pero es un poco más legible. También incluye las correcciones de errores de gregm y una corrección de errores propia.
fuente
<com.example.zengame1.FontFitTextView android:paddingTop="5dip" android:id="@+id/childs_name" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:layout_gravity="center" android:textSize="@dimen/text_size"/>
float hi = this.getHeight() - this.getPaddingBottom() - this.getPaddingTop();
He escrito una clase que extiende TextView y hace esto. Solo usa measureText como sugieres. Básicamente tiene un tamaño de texto máximo y un tamaño de texto mínimo (que se puede cambiar) y solo recorre los tamaños entre ellos en decrementos de 1 hasta que encuentra el más grande que se ajuste. No es particularmente elegante, pero no conozco otra forma.
Aquí está el código:
fuente
Este es un plano de velocidad
FontFitTextView
, pero solo disminuye el tamaño de la fuente si es necesario para que el texto se ajuste, y de lo contrario mantiene su tamaño de fuente. No aumenta el tamaño de fuente para adaptarse a la altura.Aquí hay un ejemplo de cómo podría usarse en xml:
Esto mantendría el tamaño de la fuente a 60sp siempre que el texto se ajuste al ancho. Si el texto es más largo, disminuirá el tamaño de la fuente. En este caso, la
TextView
altura de s también cambiará debido aheight=wrap_content
.Si encuentra algún error, no dude en editar.
fuente
this.setMeasuredDimension(parentWidth, height);
match_parent
ywrap_content
.text.isEmpty()
sería"".equals(text)
.Aquí está mi solución que funciona en emulador y teléfonos, pero no muy bien en el editor de diseño de Eclipse. Está inspirado en el código de Kilaka, pero el tamaño del texto no se obtiene de Paint, sino de la medición de la llamada TextView
measure(0, 0)
.La clase de Java:
El archivo de atributos XML:
Consulte mi github para obtener la última versión de esta clase. Espero que pueda ser útil para alguien. Si se encuentra un error o si el código necesita explicación, no dude en abrir un problema en Github.
fuente
Muchas gracias a https://stackoverflow.com/users/234270/speedplane . ¡Gran respuesta!
Aquí hay una versión mejorada de su respuesta que también se ocupa de la altura y viene con un atributo maxFontSize para limitar el tamaño de la fuente (fue útil en mi caso, por lo que quería compartirlo):
Archivo /res/values/attr.xml correspondiente:
Ejemplo:
Para usar el nuevo
maxFontSize
atributo, no olvide agregarxmlns:res-auto="http://schemas.android.com/apk/res-auto"
como se muestra en el ejemplo.fuente
Tuve el mismo problema y escribí una clase que parece funcionar para mí. Básicamente, usé un diseño estático para dibujar el texto en un lienzo separado y volver a medir hasta que encuentre un tamaño de fuente que se ajuste. Puede ver la clase publicada en el tema a continuación. Espero que ayude.
Texto de escala automática Ver texto para ajustarlo dentro de los límites
fuente
Ahora puede hacer esto sin una biblioteca de terceros o un widget. Está integrado en TextView en el nivel 26 de API. Agréguelo
android:autoSizeTextType="uniform"
a suTextView
y configure la altura. Eso es todo.https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html
También puede usar
TextViewCompat
por compatibilidad.fuente
Ligera modificación a onMeasure:
Y búsqueda binaria en refitText:
fuente
trySize *= availableWidth / measured_width
(luego se fija a minTextSize).Encontré lo siguiente que funciona muy bien para mí. No se repite y representa tanto la altura como el ancho. Tenga en cuenta que es importante especificar la unidad PX al llamar a setTextSize en la vista. Gracias al consejo en una publicación anterior por esto!
Aquí está la rutina que uso, pasando el getPaint () desde la vista. Se utiliza una cadena de 10 caracteres con un carácter 'ancho' para estimar el ancho independientemente de la cadena real.
fuente
Funciona con modificaciones
Debe establecer el tamaño de la vista de texto de esta manera porque, de lo contrario, setTextSize supone que el valor está en unidades SP:
Y necesitabas agregar explícitamente este código.
fuente
Úselo
app:autoSizeTextType="uniform"
para la compatibilidad con versiones anteriores porqueandroid:autoSizeTextType="uniform"
solo funciona en API Nivel 26 y superior.fuente
Utilicé una variación de la solución Dunni anterior, pero ese código en particular no funcionó para mí. En particular, cuando se intenta utilizar el conjunto de objetos Paint para tener los rasgos del objeto Paint de la vista, y luego llamar a measureText (), no devuelve el mismo valor que llamar directamente al objeto Paint de la vista. Quizás haya algunas diferencias en la forma en que se configuran mis puntos de vista que hacen que el comportamiento sea diferente.
Mi solución fue usar directamente la pintura de la vista, aunque podría haber algunas penalizaciones de rendimiento al cambiar el tamaño de fuente de la vista varias veces.
fuente
He estado trabajando para mejorar la excelente solución de speedplane, y se me ocurrió esto. Gestiona la altura, incluida la configuración del margen de manera que el texto debe centrarse correctamente verticalmente.
Utiliza la misma función para obtener el ancho, ya que parece funcionar mejor, pero utiliza una función diferente para obtener la altura, ya que la altura no se proporciona en ninguna parte. Hay algunas correcciones que deben hacerse, pero descubrí una forma de hacerlo, a la vez que parecía agradable a la vista.
fuente
Google ya hizo esta función.
https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html
fuente
Tuve este dolor en mis proyectos por tanto tiempo hasta que encontré esta biblioteca:
Solo necesita agregar el xml según sus necesidades y listo. Por ejemplo:
fuente
Inspirado por los carteles anteriores, quería compartir mi solución. Funciona con un factor de escala que se aplica al tamaño de fuente anterior para que se ajuste al espacio disponible. Además de evitar un comportamiento inesperado del método TextViews onDraw, simplemente dibuja el texto por sí solo.
fuente
fuente
Esta debería ser una solución simple:
fuente
Extienda TextView y anule onDraw con el siguiente código. Mantendrá la relación de aspecto del texto pero lo ajustará para llenar el espacio. Puede modificar fácilmente el código para estirarlo si es necesario.
fuente
Escribí una clase de ayuda breve que hace que una vista de texto se ajuste a un cierto ancho y agrega elipsis "..." al final si no se puede lograr el tamaño de texto mínimo.
Tenga en cuenta que solo hace que el texto sea más pequeño hasta que encaje o hasta que se alcance el tamaño mínimo de texto. Para probar con tamaños grandes, configure el tamaño del texto en un número grande antes de llamar al método de ayuda.
Se necesitan píxeles, por lo que si está utilizando valores de dimen, puede llamarlo así:
Esta es la clase que uso:
fuente
Si se establece una transformación como allCaps, el enfoque de speedplane es defectuoso. Lo arreglé, dando como resultado el siguiente código (lo siento, mi reputación no me permite agregar esto como un comentario a la solución de speedplane):
fuente
No sé si esta es la forma correcta o no, pero está funcionando ... tome su vista y verifique OnGlobalLayoutListener () y obtenga textview linecount y luego configure textSize.
Su código de línea muy simple.
fuente