Comment affecter la taille du texte dans la valeur sp à l'aide du code java


206

Si j'attribue une valeur entière pour modifier une certaine taille de texte d'un TextViewcode java à l'aide, la valeur est interprétée comme pixel ( px).

Maintenant, quelqu'un sait-il comment l'attribuer sp?

Réponses:


536

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

Exemple:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);

19
Étant donné que SP représente les pixels mis à l'échelle, vous devrez réduire la taille en fonction de la densité de l'écran. Cela se fait facilement comme suit: SCREEN_DENSITY = getResources (). GetDisplayMetrics (). Density; yourView.setTextSize (TypedValue.COMPLEX_UNIT_SP, (desireTextHeightInSP / SCREEN_DENSITY);
PeteH

4
La solution n'a pas fonctionné pour moi lorsque j'ai essayé de collecter le SP à partir des ressources. PeteH, tu m'as mis sur la bonne voie! Les éléments suivants ont fait l'affaire pour moi: ... float textSize = getResources (). GetDimension (R.dimen.textsize) / getResources (). GetDisplayMetrics (). Density; myTextView.setTextSize (TypedValue.COMPLEX_UNIT_SP, textSize);
P Kuijpers

52
Si vous obtenez la taille sp de vos ressources, vous devez utiliser COMPLEX_UNIT_PX, comme ceci: textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));obtenir votre taille de texte de cette façon convertira déjà SP en PX, en tenant compte à la fois de la densité d'écran et du facteur d'échelle du texte.
Ciske Boekelo du

La solution fournie a fonctionné pour moi comme indiqué. Merci!
Martin Erlic

35

Vous pouvez utiliser un DisplayMetricsobjet pour faciliter la conversion entre pixels et pixels mis à l'échelle avec l' scaledDensityattribut .

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

1
Cela prendra en compte le facteur d'échelle de densité d'écran, mais pas le facteur d'échelle de texte que l'utilisateur peut avoir spécifié via les paramètres. Je pense que la solution de @ Santosh tiendra compte de ce facteur, contrairement à cet extrait.
greg7gkb

3
Mais parfois, vous ne pouvez pas utiliser la méthode de @Santosh par exemple lorsque vous écrivez un Paint dans un canevas. Ensuite, cette méthode est pratique et fonctionne assez bien, donc bravo pour ces deux réponses!
byemute

1
@ greg7gkb n'est pas vrai, la documentation indique may be adjusted in smaller increments at runtime based on a user preference for the font sizeque la taille de police sera prise en compte.
Luca Vitucci

32

Une approche plus propre et plus réutilisable est

définir la taille du texte dans le dimens.xmlfichier à l'intérieur du res/values/répertoire:

</resources>
   <dimen name="text_medium">14sp</dimen>
</resources>

puis l'appliquer à TextView:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));

20

Basé sur le code source 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()));
}

Je construis cette fonction pour calculer toute démension en pixels:

int getPixels(int unit, float size) {
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    return (int)TypedValue.applyDimension(unit, size, metrics);
}

Où l'unité est quelque chose comme TypedValue.COMPLEX_UNIT_SP.


la dernière méthode est un épargnant de vie.
Ajibola

12

Par défaut setTextSize, sans les unités fonctionnent en SP (échelles pixel)

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

Merci @John Leehey et @PeterH:

desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);

Le problème est que si vous définissez R.dimen.desired_sp à 25 dans votre dimen.xml

  1. Sur un appareil non HD: la vitesse souhaitée est toujours de 25, densité = 1
  2. Sur un appareil HD (comme Nexus 7 2nd Generation): laSp souhaitée devient 50 ish, la densité = 2

11

Lorsque la réponse acceptée ne fonctionne pas (par exemple lorsque vous traitez avec Paint), vous pouvez utiliser:

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);

ok, ça marche, c'est ce que je veux, merci pomber pour le partager!
M. Lemon

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

Veuillez expliquer en quoi la définition de la taille du texte comme valeur de pixel (COMPLEX_UNIT_PX) sera utile. OP veut "assigner la taille du texte dans la valeur sp"
Bö macht Blau

si vous utilisez, COMPLEX_UNIT_PXvous devez diviser la densité.
William Hu

Je pense que c'est parce que getDimension a déjà converti 'dp' en 'px'
Ali Mousavi Kherad

3

Il s'agit du code pour convertir le format PX en SP . 100% fonctionne

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);

0

Après avoir essayé toutes les solutions et aucune ne donnant des résultats acceptables (peut-être parce que je travaillais sur un appareil avec de très grandes polices par défaut), ce qui suit a fonctionné pour moi (COMPLEX_UNIT_DIP = Pixels indépendants de l'appareil):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

0

À partir du niveau 1 d'API, vous pouvez utiliser la public void setTextSize (float size)méthode.

De la documentation:

Définissez la taille de texte par défaut sur la valeur donnée, interprétée comme des unités de "pixels mis à l'échelle". Cette taille est ajustée en fonction de la densité actuelle et de la préférence de taille de police de l'utilisateur.

Paramètres: size -> float: taille du pixel à l'échelle.

Vous pouvez donc faire simplement:

textView.setTextSize(12); // your size in sp
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.