tamaño - formato de texto en android studio
Cómo asignar el tamaño del texto en valor sp usando código java (10)
Si asigno un valor entero para cambiar un cierto tamaño de texto de una Vista de texto usando código Java, el valor se interpreta como píxel (px). Ahora, ¿alguien sabe cómo asignarlo en sp?
Basado en el código fuente de setTextSize
:
public void setTextSize(int unit, float size) {
Context c = getContext();
Resources r;
if (c == null)
r = Resources.getSystem();
else
r = c.getResources();
setRawTextSize(TypedValue.applyDimension(
unit, size, r.getDisplayMetrics()));
}
Construyo esta función para calular cualquier demension a pixeles:
int getPixels(int unit, float size) {
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
return (int)TypedValue.applyDimension(unit, size, metrics);
}
Donde unidad es algo así como TypedValue.COMPLEX_UNIT_SP
.
Cuando la respuesta aceptada no funciona (por ejemplo, cuando se trata de Paint) puede usar:
float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);
En caso de que alguien esté buscando la forma de Kotlin, puede hacer
view.textSize = 12f
Este es el código para el formato de conversión de PX a SP . 100% funciona
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
Gracias @John Leehey y @PeterH:
desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);
El problema es si defines R.dimen.desired_sp a 25 en tu dimen.xml
- En dispositivos no HD: desiredSp sigue siendo 25, densidad = 1
- En dispositivo HD (como Nexus 7 2nd Generation): desiredSp se convierte en 50 ish, densidad = 2
Por defecto setTextSize, sin unidades, funciona en SP (escala de píxeles)
public void setTextSize (float size)
Added in API level 1
Set the default text size to the given value, interpreted as "scaled pixel" units. This
size is adjusted based on the current density and user font size preference.
Puede usar un objeto DisplayMetrics
para ayudar a convertir entre píxeles y píxeles escalados con el atributo scaledDensity
.
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity;
Un enfoque más limpio y más reutilizable es
defina el tamaño del texto en el archivo dimens.xml
dentro de res/values/
directory:
</resources>
<dimen name="text_medium">14sp</dimen>
</resources>
y luego aplicarlo a TextView
:
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));
http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29
Ejemplo:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
context.getResources().getDimension(R.dimen.text_size_in_dp))