getDimension () / getDimensionPixelSize () - problème de mutliplier
J'ai donc android 2.3.5 de l'appareil, ce qui est NORMAL/HDPI. J'ai un dimens.xml dans mon projet:
...
<dimen name="gameresult_congrats_label_msg_textSize">20sp</dimen>
...
ce fichier est absolument identique dans les valeurs normales/valeurs-hdpi et donc sur les dossiers.
Dans ma première activité de l'application m'indique que la valeur à l'aide de:
Toast.makeText(this, "textSize is "+getResources().getDimensionPixelSize(R.dimen.gameresult_congrats_label_msg_textSize), Toast.LENGTH_SHORT).show();
et il affiche 30. J'ai Essayé aussi:
Toast.makeText(this, "textSize is "+getResources().getDimension(R.dimen.gameresult_congrats_label_msg_textSize), Toast.LENGTH_SHORT).show();
mais le résultat est le même. Mais seulement quand j'ai essayé ceci:
Toast.makeText(this, "textSize is "+getResources().getString(R.dimen.gameresult_congrats_label_msg_textSize), Toast.LENGTH_SHORT).show();
J'ai obtenu mon "20sp" enfin!!! Mais pourquoi est-ce? Officiel docs dit que ces méthodes retourne
Dimension ressources valeur multipliée par la mesure appropriée.
J'ai vérifié en changeant ma valeur de 25 ans et j'ai 38 qui signifie aos utilise 1,5 multiplicateur. Mais pourquoi? Il fait déjà de la valeur de dossier approprié, ce qui signifie qu'il obtient un prêt à la valeur d'usage! D'où l'am obtient 1,5 x multiplicateur? Je sais que cela dépend de DisplayMetrics. Mais comment il calcule 1,5 x?
Mise à JOUR
Je comprends que sur le multiplicateur mais, voyez-vous, le vrai problème ici est environ le double de la mise à l'échelle. Et c'est pourquoi j'ai posé cette question.
Donc, si j'ai quelques layout.xml (dans res\mise en page du dossier) avec TexView défini comme:
<TextView
android:id="@+id/congratsLabel"
...
android:textSize="@dimen/gameresult_congrats_label_msg_textSize" />
Tout semble ok. Je veux dire textview est comme Im attend.
Maintenant permet de faire la même chose dans le code:
TextView congratsLabel = fineViewById(R.id.congratsLabel);
textSize = getResources().getDimension(R.dimen.gameresult_congrats_label_msg_textSize)
congratsLabel.setTextSize(textSize)
et là est la question!!! getResources().getDimension() renvoie un ÉCHELLE valeur et c'est ok. Mais la taille de mon textView sera de 1,5 plus que ce que j'attend cuz setTextSize fonctionne avec SP et voici la deuxième échelle! Et c'est pourquoi l'AM fait résultant de texte de taille adapté à 45 (initialement définie comme 20sp).
source d'informationauteur Stan
Vous devez vous connecter pour publier un commentaire.
Par la À l'appui des Différents Écran Densités de formationhdpi est de 1,5 x la normale (mdpi) tailles. Comme
getDimensionPixelSize
prend en compte cette distinction lors de la conversion en pixels, la valeur retournée sera de 1,5 x votre valeur danssp
.Noter que
sp
est également dépendante sur le préféré de l'utilisateur la taille du texte et peuvent donc être modifiés afin d'être encore plus grand que 1,5 x votre valeur attendue.Juste pour préciser (information obtenue par l'inspection de code source Android):
Resources.getDimension()
etgetDimensionPixelOffset()
/getDimensionPixelSize()
diffèrent seulement en ce que la première renvoiefloat
tandis que les deux derniers renvoient la même valeur arrondie àint
de façon appropriée. Pour eux tous, la valeur de retour est en raw pixels.Tous les trois fonctions sont mises en œuvre par l'appel de
Resources.getValue()
et la conversion de la ainsi obtenuTypedValue
en appelantTypedValue.complexToDimension()
TypedValue.complexToDimensionPixelOffset()
etTypedValue.complexToDimensionPixelSize()
respectivement.Par conséquent, si vous voulez obtenir le "raw" de la valeur en collaboration avec l'unité de mesure spécifiée dans la source XML, appel
Resources.getValue()
et utiliser les méthodes de laTypedValue
classe.Méthode getDimension() convertit dp sp ou des valeurs en pixels, sur la base actuelle densité de l'écran. Ceci est très utile lorsque vous n'avez pas à le faire sur votre propre, si vous voulez mettre en Java largeur ou la taille du texte (ils n'accepte que les pixels).
Mais si vous avez besoin d'origine sp ou dp, vous pourriez faire du "reverse engineering".
L'étape 1. Vérifier le niveau actuel du ratio de (basé sur la densité de l'écran):
L'étape 2. Obtenir la dimension de dimens.xml
L'étape 3. Faire quelques calculs
Remarques:
Lire plus sur les dimensions dans Android: http://android4beginners.com/2013/07/appendix-c-everything-about-sizes-and-dimensions-in-android/
Si quelqu'un d'autre a besoin de cette :
Pour traiter le double problème de montée en charge Stan afficher lors de l'utilisation de getDimensionPixelSize avec TextView.setTextSize :
Vous pouvez utiliser la version alternative de setTextSize où vous pouvez spécifier l'unité comme ceci :
Parce que... NORMAL n'est PAS hdpi...
Normal est mdpi (160dpi) = 1,0 x.
hdpi (240dpi) est de 1,5 x.
xhdpi (320dpi) est de 2,0 x.
xxdpi (480dpi) est de 3,0 x.
xxxhdpi (640dpi) 4.0 x.
Et (le dernier, mais pas moins) ldpi (120 ppp) est de 0,75 x.