Si asigno un valor entero para cambiar un cierto tamaño de texto de un TextView
código Java, el valor se interpreta como pixel ( px
).
Ahora, ¿alguien sabe cómo asignarlo sp
?
Si asigno un valor entero para cambiar un cierto tamaño de texto de un TextView
código Java, el valor se interpreta como pixel ( px
).
Ahora, ¿alguien sabe cómo asignarlo sp
?
Respuestas:
http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29
Ejemplo:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));
Obtener su tamaño de texto de esta manera ya convertirá SP a PX, teniendo en cuenta tanto la densidad de la pantalla como el factor de escala del texto.
Puede usar un DisplayMetrics
objeto para ayudar a convertir entre píxeles y píxeles escalados con el scaledDensity
atributo .
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity;
may be adjusted in smaller increments at runtime based on a user preference for the font size
que se tendrá en cuenta el tamaño de la fuente .
Un enfoque más limpio y más reutilizable es
definir el tamaño del texto en el dimens.xml
archivo dentro del res/values/
directorio:
</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));
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 calcular cualquier degradación a píxeles:
int getPixels(int unit, float size) {
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
return (int)TypedValue.applyDimension(unit, size, metrics);
}
Donde la unidad es algo así TypedValue.COMPLEX_UNIT_SP
.
De forma predeterminada, setTextSize, sin unidades funciona en SP (escalas 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.
Gracias @John Leehey y @PeterH:
desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);
La cuestión es si define R.dimen.desired_sp a 25 en su dimen.xml
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);
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
context.getResources().getDimension(R.dimen.text_size_in_dp))
COMPLEX_UNIT_PX
necesitas dividir la densidad.
Este es el código para convertir PX a formato SP . 100% de obras
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
Después de probar todas las soluciones y ninguna de ellas dio resultados aceptables (tal vez porque estaba trabajando en un dispositivo con fuentes muy grandes predeterminadas), lo siguiente funcionó para mí (COMPLEX_UNIT_DIP = Píxeles independientes del dispositivo):
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
Desde el nivel 1 de Api, puedes usar el public void setTextSize (float size)
método.
De la documentación:
Establezca el tamaño de texto predeterminado en el valor dado, interpretado como unidades de "píxeles escalados". Este tamaño se ajusta en función de la densidad actual y la preferencia de tamaño de fuente del usuario.
Parámetros: tamaño -> flotante: el tamaño de píxel escalado.
Entonces puedes hacer simplemente:
textView.setTextSize(12); // your size in sp