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?

Capecrawler
fuente

Respuestas:

535

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

Ejemplo:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
Santosh
fuente
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; 
Dave Webb
fuente
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));
klimat
fuente
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.

rekire
fuente
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.
Monolítica Zeus
fuente
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
macio.Jun
fuente
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);
pomber
fuente
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))
William Hu
fuente
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);
Kamran Gasimov
fuente
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);
tsig
fuente
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
user2342558
fuente