web-dev-qa-db-fra.com

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

Je fais:

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

Selon la documentation, les unités de largeur et de hauteur (les deux 65 dans ce qui précède) sont des "pixels". Comment forcer ceci à être des pixels indépendants du périphérique, ou "dp"?

288
SK9

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

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

Je sais que c’est une vieille question, mais j’ai trouvé un moyen beaucoup plus ordonné de procéder à cette conversion.

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

manière la plus simple (et même fonctionne à partir de api 1) qui a testé est:

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

À partir de documentations:

Récupérer une dimension pour un ID de ressource particulier à utiliser comme taille en pixels bruts. Identique à getDimension (int), sauf que la valeur renvoyée est convertie en pixels entiers et utilisée comme taille. Une conversion de taille implique d'arrondir la valeur de base et de s'assurer qu'une valeur de base non nulle a une taille d'au moins un pixel.

Oui, arrondir la valeur, mais ce n'est pas très grave (juste dans les valeurs impaires sur les périphériques hdpi et ldpi, il faut ajouter une petite valeur lorsque ldpi n'est pas très courant). J'ai testé dans un périphérique xxhdpi qui convertit 4dp en 16 (pixels) vrai.

34
David

En regardant vos besoins, il existe 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 celle-ci 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 prolongeant cette idée, vous pouvez simplement stocker la valeur de 1dp ou 1sp en tant qu'entrée dimen, puis interroger la valeur et l'utiliser en tant que multiplicateur. En utilisant cette approche, vous isolerez le code des éléments mathématiques et vous ferez appel à la bibliothèque pour effectuer les calculs.

34
vine'th