Примечание. Широко используемое решение основано на displayMetrics.density
. Тем не менее, документы объясняют, что это значение является округленным значением, используемым с экраном «корзины». Например. на моем Nexus 10 он возвращает 2, где реальное значение будет 298dpi (реальное) / 160dpi (по умолчанию) = 1,8625.
В зависимости от ваших требований, вам может потребоваться точное преобразование, которое может быть достигнуто следующим образом:
[Редактировать] Это не предназначено для смешивания с внутренним модулем 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, которые вы, возможно, захотите различить, но я не могу представить себе нормальное отображение, в котором эти значения сильно различаются.