Comment attribuer la taille du texte dans la valeur sp en utilisant le code java
Si j'attribue une valeur entière pour modifier une certaine taille de texte D'un TextView en utilisant du code java, la valeur est interprétée comme pixel (px). Maintenant, quelqu'un sait-il comment l'assigner dans sp?
11 réponses
Http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29
Exemple:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
, Vous pouvez utiliser un DisplayMetrics
objet pour aider à convertir entre les pixels et mise à l'échelle des pixels avec les scaledDensity
attribut.
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity;
Une approche plus propre et plus réutilisable est
Définir la taille du texte dans le fichier dimens.xml
à l'intérieur du répertoire res/values/
:
</resources>
<dimen name="text_medium">14sp</dimen>
</resources>
, puis l'appliquer à la TextView
:
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));
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 caluler toute demension 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
.
Par défaut setTextSize, sans unités fonctionnent dans 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.
Merci @ John Leehey et @ PeterH:
desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);
La chose est si vous définissez R. dimen.desired_sp à 25 dans votre dimen.xml
- sur un périphérique non HD: desiredSp est toujours 25, Densité = 1
- sur appareil HD (comme Nexus 7 2ème Génération): desiredSp devient 50 ish, densité = 2
Lorsque la réponse acceptée ne fonctionne pas (par exemple lorsqu'il s'agit de Paint), vous pouvez utiliser:
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))
C'est le code pour le convertir PX à SP format. 100% fonctionne
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
Après avoir essayé toutes les solutions et aucune donnant des résultats acceptables (peut-être parce que je travaillais sur un périphérique avec des polices par défaut très grandes), ce qui suit a fonctionné pour moi (COMPLEX_UNIT_DIP = pixels indépendants du périphérique):
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
Dans le cas où quelqu'un cherche Kotlin way, vous pouvez faire
view.textSize = 12f