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?

capecrawler
la source

Réponses:

536

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

Exemple:

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

rekire
la source
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.
Zeus Monolitics
la source
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
macio.Jun
la source
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);
bombardier
la source
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))
William Hu
la source
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);
Kamran Gasimov
la source
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);
tsig
la source
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
user2342558
la source