Примечание: широко используемое решение выше основано на displayMetrics.density
. Тем не менее, документы объясняют, что это значение является округленным значением, используемым с экраном «корзины». Например. на моем Nexus 10 он возвращает 2, где реальное значение будет 298dpi (реальное) / 160dpi (по умолчанию) = 1,8625.
В зависимости от ваших требований вам может потребоваться точное преобразование, которое может быть достигнуто следующим образом:
[Edit] Это не предназначено для смешивания с внутренним модулем dp Android, так как это, конечно, все еще основано на экранах. Используйте это там, где вы хотите, чтобы блок отображал один и тот же реальный размер на разных устройствах.
Преобразовать дп в пиксель:
public int dpToPx(int dp) {
DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
}
Преобразовать пиксель в дп:
public int pxToDp(int px) {
DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
return Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
}
Обратите внимание, что есть свойства xdpi и ydpi, которые вы, возможно, захотите различить, но я не могу представить нормальное отображение, где эти значения сильно различаются.