Как соотносятся dp, dip, dpi, ppi, пиксели и дюймы?

Я читал ДП, дип, ПКС, измерения СП, но у меня все еще есть некоторые вопросы о dp/dpi vs ppi vs px vs inch. Я не могу их сравнить... дюйм самый большой?

Они говорят, что 160 dpi означает 160 пикселей на один дюйм. Это значит, что 1 дюйм содержит 160 пикселей?

Они также говорят, что 1 пиксель на экране 160 dpi = 1 dp. Означает ли это, что 1 пиксель и 1 dp равны?

и, наконец, почему мы должны использовать dp вместо px? Я понимаю, что это идеально, но почему?

5 ответов


вы должны (почти) всегда использовать гибкие единицы измерения, такие как dp, который не зависит от плотности пикселей, потому что 300px на одном устройстве не обязательно такое же количество экранной недвижимости, как 300px на другой. Самый большой практический вывод заключается в том, что ваш макет будет выглядеть значительно иначе на устройствах с другой плотностью, чем тот, на который нацелен ваш дизайн.

  • dp или dip значит плотность-независимый Пиксели
  • dpi или ppi означает точки (или пиксели) на дюйм
  • inch это физическое измерение, подключенное к фактическому размеру экрана
  • px означает пиксели-пиксель заполняет произвольное количество области экрана в зависимости от плотности.

например, на 160dpi экрана 1dp == 1px == 1/160in, но на 240dpi экрана 1dp == 1.5px. Так что нет,1dp != 1px. Есть ровно один случай, когда 1dp == 1px, и на 160dpi экран. Физические единицы измерения, такие как дюймы, должны никогда быть частью вашего дизайна-то есть, если вы не делаете линейку.

простая формула для определения количества пикселей 1dp работает на px = dp * (dpi / 160).


как соотносятся dp, dip, dpi, ppi, пиксели и дюймы?

для целей разработки android:

dp = dip
dpi = ppi
inch x dpi = pixels
dp = 160 x inch
dp = 160*pixels/dpi

Итак, на телефоне 160dpi (mdpi):

2 inches = 320 dp
2 inches = 320 pixels

на 180 dpi телефон:

2 inches = 320 dp
2 inches = 360 pixels

обратите внимание, что 2 дюйма это всегда 320dp, независимо от размера экрана. Dp-это физическое расстояние 1/160 дюйма.

формула dp to pixels интересна:

dp = 160*pixels/dpi

Is эквивалент:

dp = pixels/(dpi/160)

dpi/160 интересный фактор. Его относительная плотность по сравнению с mdpi bin android и сумма, которую вы должны масштабировать свою графику для различных бункеров ресурсов. Вы увидите, что фактор упоминается несколько раз на этой страница, 0.75 является фактором ldpi.


ДП физическое измерение как дюймы. (Да, это так. Читайте дальше.)

"dp соответствует физическому размеру пикселя при 160 dpi" (https://developer.android.com/training/multiscreen/screendensities.html#TaskUseD)

физический размер пикселя при 160 dpi составляет ровно 1/60 дюйма. Поэтому размер dp составляет 1/160 дюйма. 160 ДП = 1 дюйм.

Px - несколько произвольная единица измерения на экран.

примеры того, что DP преобразует в px на разных устройствах, см. здесь:

https://stackoverflow.com/a/39495538/984003


DP-это разрешение, когда вы учитываете только физический размер экрана. Когда вы используете DP, он масштабирует ваш макет на другие экраны аналогичного размера с разной плотностью пикселей.

иногда вам действительно нужны пиксели, и когда вы имеете дело с размерами в коде, вы всегда имеете дело с реальными пикселями, если вы их не конвертируете.


поясню на примере.

float density = context.getResources().getDisplayMetrics().density;
float px = someDpValue * density;
float dp = somePxValue / density;

равна плотности

.75 on ldpi (120 dpi)
1.0 on mdpi (160 dpi; baseline)
1.5 on hdpi (240 dpi)
2.0 on xhdpi (320 dpi)
3.0 on xxhdpi (480 dpi)
4.0 on xxxhdpi (640 dpi)

так, например,

у меня есть Samsung S5 с 432 dpi (http://dpi.lv/#1920×1080@5.1").

и density = 432/160 = phone's dpi/baseline = 2.7

Пусть мой верхний бар 48dp. Это ссылается на baseline (160dpi).

Итак, w.r.t мой S5, это будет 48dp * 2.7.

тогда, если я хочу увидеть фактическую высоту:

будет (48dp * 2.7) / 432 dpi = 0.3 inches.