Cómo asignar tamaño de texto en valor sp usando código java


205

Si asigno un valor entero para cambiar un cierto tamaño de texto de un TextViewcódigo Java, el valor se interpreta como pixel ( px).

Ahora, ¿alguien sabe cómo asignarlo sp?

Respuestas:


535

http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29

Ejemplo:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);

19
Dado que SP significa píxeles escalados , deberá reducir el tamaño según la densidad de la pantalla. Se hace fácilmente de la siguiente manera: SCREEN_DENSITY = getResources (). GetDisplayMetrics (). Density; yourView.setTextSize (TypedValue.COMPLEX_UNIT_SP, (deseadoTextHeightInSP / SCREEN_DENSITY);
PeteH

44
La solución no funcionó para mí cuando intenté recopilar SP de los recursos. PeteH, me tienes en el camino correcto! Lo siguiente hizo el truco para mí: ... float textSize = getResources (). GetDimension (R.dimen.textsize) / getResources (). GetDisplayMetrics (). Density; myTextView.setTextSize (TypedValue.COMPLEX_UNIT_SP, textSize);
P Kuijpers

52
Si obtiene el tamaño sp de sus recursos, debe usar COMPLEX_UNIT_PX, de esta manera: 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.
Ciske Boekelo

La solución proporcionada funcionó para mí como se muestra. ¡Gracias!
Martin Erlic

35

Puede usar un DisplayMetricsobjeto para ayudar a convertir entre píxeles y píxeles escalados con el scaledDensityatributo .

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity; 

1
Esto tendrá en cuenta el factor de escala de densidad de pantalla, pero no el factor de escala de texto que el usuario puede haber especificado a través de la configuración. Creo que la solución de @ Santosh tendrá en cuenta este factor, mientras que este fragmento no lo hace.
greg7gkb

3
Pero a veces no puede usar el método de @Santosh, por ejemplo, cuando escribe un Paint en un lienzo. Entonces este método es útil y funciona bastante bien, por lo tanto, ¡aprueba estas dos respuestas!
byemute

1
@ greg7gkb no es cierto, la documentación dice may be adjusted in smaller increments at runtime based on a user preference for the font sizeque se tendrá en cuenta el tamaño de la fuente .
Luca Vitucci

32

Un enfoque más limpio y más reutilizable es

definir el tamaño del texto en el dimens.xmlarchivo 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));

20

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.


El último método es un salvavidas.
Ajibola

12

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.

11

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

  1. En dispositivos que no son HD: deseadoSp sigue siendo 25, densidad = 1
  2. En un dispositivo HD (como Nexus 7 2nd Generation): deseadoSp se convierte en 50 ish, densidad = 2

11

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);

ok, funciona, eso es lo que quiero, ¡gracias pomber por compartirlo!
Sr. Lemon el

8
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))

Explica cómo será útil establecer el tamaño del texto como valor de píxel (COMPLEX_UNIT_PX). OP quiere "asignar tamaño de texto en valor sp"
Bö macht Blau

si usas COMPLEX_UNIT_PXnecesitas dividir la densidad.
William Hu

Creo que es porque getDimension ya convirtió 'dp' a 'px'
Ali Mousavi Kherad

3

Este es el código para convertir PX a formato SP . 100% de obras

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);

0

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);

0

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.