В документации сказано, что 160 dp (независимо от плотности) равно 1 дюйму. И 72 пт это тоже 1 дюйм.
Нюанс здесь заключается в том, что 160 dp
(или dip
) составляет примерно 1 дюйм, в то время как 72 pt
составляет точно 1 дюйм. Разница заключается в том, как Android преобразует обе единицы измерения в пиксели, что зависит от плотности экрана устройства.
Один dp
- это один px
на устройстве с разрешением 160 точек на дюйм. Android использует «корзину плотности», в которую попадает устройство, и умножает масштабирующее устройство для преобразования dp
в px
.
Bucket | DPI | Scaler
---------------------
ldpi | 120 | 0.75
mdpi | 160 | 1.00
tvdpi | 213 | 1.33
hdpi | 240 | 1.50
xhdpi | 320 | 2.00
xxhdpi | 480 | 3.00
dp
в px
преобразует следующую формулу: dp * scaler = px
.
Один pt
составляет ровно 1/72 дюйма при любой плотности экрана. Android преобразует pt
в px
с использованием точных точек на дюйм (xdpi и ydpi) экрана устройства.
pt
в px
преобразует следующую формулу: pt / 72 * dpi = px
.
Так что я не понимаю, почему Android определяет измерение dp, хотя кажется, что оно работает так же, как точки. Кто-нибудь может это объяснить? Зачем мне использовать dp, если я могу использовать pt?
Возьмем пример: дисплей 160 dp
и 72 pt
на устройстве с разрешением 160 точек на дюйм. Устройство с разрешением 160 dpi попадает в корзину плотности mdpi с масштабатором 1,0. Используйте приведенные выше формулы для преобразования в px
.
160 dp * 1.0 = 160 px
72 pt / 72 * 160 = 160 px
Как насчет устройства с разрешением 170 точек на дюйм? Устройство с разрешением 170 dpi попадает в область плотности mdpi с масштабатором 1,0.
160 dp * 1.0 = 160 px
72 pt / 72 * 170 = 170 px
Как насчет устройства с разрешением 150 точек на дюйм? Устройство с разрешением 150 dpi попадает в область плотности mdpi с масштабатором 1,0.
160 dp * 1.0 = 160 px
72 pt / 72 * 150 = 150 px
Мораль этой истории в том, что dp
сохраняет точные размеры и помогает поддерживать производительность, позволяя изменять физические размеры в зависимости от плотности устройства. С другой стороны, pt
- это один и тот же физический размер для каждой плотности, что приводит к разному количеству px
, что может снизить производительность и стать причиной появления псевдонимов и артефактов при использовании на изображениях. dp
рекомендуется, если не требуются абсолютно точные физические размеры (у вас есть линейка на экране и т. Д.).
Я написал подробный блог о единицах измерения Android, который дает больше информации и пример кода - Понимание независимости от плотности в Android