332 votes

Android et réglage programmatique de la largeur et de la hauteur en unités dp

C'est ce que je fais :

button.setLayoutParams(new GridView.LayoutParams(65, 65));

Selon la documentation, les unités de largeur et de hauteur (65 dans l'exemple ci-dessus) sont des "pixels". Comment faire en sorte que ce soit des pixels indépendants du périphérique, ou "dp" ?

573voto

Robby Pond Points 37875

Vous devrez le convertir de dps en pixels en utilisant le facteur d'échelle de l'affichage.

final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);

121 votes

La conversion correcte est (int) (dps * scale + 0.5f). C'est la formule que nous utilisons dans tout le cadre.

8 votes

La formule est dans les docs. Pour en savoir plus, allez à la section 3 de developer.Android.com/guide/practices/

37 votes

@RomainGuy, pouvez-vous s'il vous plaît ajouter une fonction utilitaire à l'API pour convertir de dp a px ? Merci.

258voto

drspaceboo Points 971

Je sais qu'il s'agit d'une vieille question, mais j'ai trouvé un moyen beaucoup plus efficace d'effectuer cette conversion.

Java

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());

Kotlin

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)

9 votes

Bravo pour avoir trouvé comment faire. Je ne suis pas fan de la répétition d'une formule à plusieurs endroits ! Merci.

2 votes

Si ce n'est pas le cas, créez une fonction avec la formule

1 votes

@Kenobi Il fait la conversion pour vous de DP à PX. Le site 65 ci-dessus est la valeur DP que vous voulez convertir en PX

45voto

David Points 991

Le moyen le plus simple (et qui fonctionne même depuis l'api 1) qui a été testé est :

getResources().getDimensionPixelSize(R.dimen.example_dimen);

A partir de documentations :

Récupérer une dimension pour un ID de ressource particulier pour l'utiliser comme une taille. en pixels bruts. C'est la même chose que getDimension(int), sauf que la valeur retournée est convertie en pixels entiers. valeur retournée est convertie en pixels entiers pour être utilisée comme taille. A conversion de la taille implique d'arrondir la valeur de base et de s'assurer qu'une valeur de base non nulle est au moins égale à la valeur de base. valeur de base non nulle est au moins égale à un pixel.

Oui, il arrondit la valeur mais ce n'est pas très mauvais (juste dans les valeurs impaires sur les appareils hdpi et ldpi, il faut ajouter une petite valeur quand le ldpi n'est pas très courant). J'ai testé dans un appareil xxhdpi qui convertit 4dp en 16(pixels) et c'est vrai.

43voto

vine'th Points 2279

Si l'on considère vos besoins, il existe également une autre solution. Il semble que vous connaissiez les dimensions dans dp au moment de la compilation, vous pouvez donc ajouter une entrée dimen dans les ressources. Ensuite, vous pouvez interroger l'entrée dimen et elle sera automatiquement convertie en pixels dans cet appel :

final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);

Et votre dimens.xml aura :

<dimen name="dimen_entry_in_dp">72dp</dimen>

En étendant cette idée, vous pouvez simplement stocker la valeur de 1dp ou 1sp en tant qu'entrée dimen et interroger cette valeur pour l'utiliser comme multiplicateur. En utilisant cette approche, vous isolerez le code de l'aspect mathématique et vous ferez confiance à la bibliothèque pour effectuer les calculs.

6voto

RickSanchez725 Points 146

En se basant sur la solution de drspaceboo, avec Kotlin vous pouvez utiliser une extension pour convertir Float aux tremplins plus facilement.

fun Float.toDips() =
        TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, resources.displayMetrics);

Utilisation :

(65f).toDips()

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