51 votes

Quelle est la bonne façon de spécifier des dimensions dans DIP à partir d'un code Java ?

J'ai découvert qu'il est possible de définir les dimensions de mes éléments d'interface dans les présentations XML en utilisant des DIP comme dans le fragment suivant :

android:layout_width="10dip"

Mais toutes les interfaces Java prennent des nombres entiers comme arguments et il n'y a aucun moyen de spécifier des dimensions dans les DIP. Quelle est la bonne façon de calculer cela ?

J'ai compris que je devais utiliser la densité de propriété de DisplayMetrics mais est-ce une façon correcte de procéder ?

Puis-je compter sur le fait que cette formule soit toujours correcte ?

pixels * DisplayMetrics.density = dip

Existe-t-il une fonction utilitaire pour la conversion quelque part dans Android ?

91voto

sirhc Points 3784

Il existe une méthode utilitaire appelée TypedValue.applyDimensions(int, float, DisplayMetrics) qui fait cela.

Voici comment l'utiliser :

// returns the number of pixels for 123.4dip
int value = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
                     (float) 123.4, getResources().getDisplayMetrics());

Il existe une liste d'autres types que vous pouvez utiliser avec lui, notamment COMPLEX_UNIT_SP , COMPLEX_UNIT_PT Toutes ces informations se trouvent sur la page que j'ai mise en lien ci-dessus. Si vous excluez le typecast (int), vous obtiendrez le nombre en virgule flottante.

J'ai rencontré le même problème et j'ai trouvé ceci en fouillant dans le code.

45voto

Roman Nurik Points 18632

C'est la bonne formule. Bien que DisplayMetrics.density n'est pas un membre statique, de sorte que, selon la norme le même document auquel vous avez fait allusion L'usage correct est le suivant :

// Maybe store this in a static field?
final float SCALE = getContext().getResources().getDisplayMetrics().density;

// Convert dips to pixels
float valueDips = 16.0f;
int valuePixels = (int)(valueDips * SCALE + 0.5f); // 0.5f for rounding

9voto

Matt Stoker Points 230

En utilisant le champ de densité des métriques d'affichage, vous pouvez obtenir un facteur d'échelle pour convertir en/depuis les creux. Utilisez la méthode Math.round pour convertir un flottant en un int sans avoir besoin d'une conversion ou d'ajouter 0,5.

// Converting dips to pixels
float dips = 20.0f;
float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = Math.round(dips * scale);

// Converting pixels to dips
int pixels = 15;
float scale = getContext().getResources().getDisplayMetrics().density;
float dips = pixels / scale;

5voto

ercan Points 646

Je pense que la meilleure façon est de ne pas définir de dimensions dans le code, mais d'utiliser la fonction values/dimens.xml à la place. Vous pouvez toujours définir votre dimension dans l'unité souhaitée :

<dimen name="my_layout_height">120dp</dimen>

et y faire référence dans votre activité :

getResources().getDimensions(R.dimen.my_layout_height);

Il en résulterait pixels après avoir effectué les conversions nécessaires. Et bien sûr, vous pouvez vous y référer dans vos autres XML, par exemple :

android:layout_width="@dimen/my_layout_height"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X