Question Android et définir la largeur et la hauteur par programmation en unités dp


Je fais:

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

Selon les documents, les unités pour la largeur et la hauteur (toutes les deux 65 ci-dessus) sont des "pixels". Comment forcez-vous à ce que les pixels soient indépendants du périphérique, ou "dp"?


252
2018-03-10 03:38


origine


Réponses:


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

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

483
2018-03-10 03:52



Je sais que c'est une vieille question, mais j'ai trouvé une façon beaucoup plus simple de procéder à cette conversion.

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

182
2018-05-09 06:52



En regardant votre besoin, il existe également une solution alternative. Il semble que vous connaissiez les dimensions dans dp au moment de la compilation, de sorte que vous pouvez ajouter une entrée dimen dans les ressources. Ensuite, vous pouvez interroger l'entrée de dimen et il sera automatiquement converti 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 de dimen et interroger la valeur et l'utiliser comme multiplicateur. En utilisant cette approche, vous isolerez le code des éléments mathématiques et vous ferez confiance à la bibliothèque pour effectuer les calculs.


28
2017-09-07 15:42



Le moyen le plus simple (et fonctionne même à partir d'API 1) testé est:

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

De documentations:

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

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


19
2018-02-12 10:56