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);
dp
à px
? Merci.
Je sais que c'est une vieille question mais j'ai trouvé une façon beaucoup plus soignée de faire cette conversion.
Java
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());
Kotlin
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)
65
précède est la valeur DP que vous souhaitez convertir en PX
En regardant votre besoin, il existe également une solution alternative. Il semble que vous connaissiez les dimensions en 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 comme entrée dimen et interroger la valeur et l'utiliser comme multiplicateur. En utilisant cette approche, vous isolerez le code des trucs mathématiques et compterez sur la bibliothèque pour effectuer les calculs.
La manière la plus simple (et fonctionne même depuis l'API 1) qui a été testée est:
getResources().getDimensionPixelSize(R.dimen.example_dimen);
Des documentations:
Récupérez une dimension pour un ID de ressource particulier pour l'utiliser comme taille en pixels bruts. C'est la même chose que getDimension (int), sauf que la valeur retournée est convertie en pixels entiers pour être utilisée comme taille. Une conversion de taille implique d'arrondir la valeur de base et de garantir qu'une valeur de base non nulle a au moins un pixel.
Oui, il arrondit la valeur mais ce n'est pas très mauvais (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) et c'est vrai.