В документации говорится, что 160 дп (плотность не зависит) составляет 1 дюйм. И 72 pt также 1 дюйм. Поэтому я не понимаю, почему android определяет измерение dp, пока он работает так же, как точки. Может кто-нибудь объяснить это? Почему я должен использовать dp, если я могу использовать pt?
Разница между размером андроида: pt и dp
Ответ 1
В документации для Android неправильно указано, что 160 dp всегда равно 1 дюйм независимо от плотности экрана. Это было сообщено как ошибка которая была принята и обновлена документация.
Из обновленной документации:
160 dp НЕ всегда будет равным 1 дюйму, он будет меняться в зависимости от размеров и плотности экрана. На экране с плотностью 160dpi (mdpi) 160 dp будет равно 1 дюйм.
1 pt всегда будет равным 1/72 дюйма, независимо от плотности экрана.
Документация для Android для этого здесь.
UPDATE:
Я сделал небольшое приложение, чтобы попытаться проверить разные размеры. Похоже, что выше, правильно, по крайней мере, когда показано на моем HTC Aria. Вот скриншот:
Интересно отметить, что эти размеры НЕ совпадали точно в графическом редакторе eclipse. Размеры dp и sp колебались в зависимости от размера экрана и разрешения в редакторе. Вот несколько скриншотов из редактора (слева - 2.7in QVGA слайдер, справа - 10.1in WXGA, обрезанный):
Было бы интересно посмотреть, соответствуют ли эти редакторы реальным устройствам. Может ли кто-нибудь проверить эти размеры? Я приложу свой xml ниже, если кто-то захочет помочь.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical">
<TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="160dp"></TextView>
<View android:id="@+id/view1" android:layout_height="20dip" android:layout_width="160dp" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View>
<TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="72pt"></TextView>
<View android:id="@+id/view2" android:layout_height="20dip" android:layout_width="72pt" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View>
<TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="1in"></TextView>
<View android:id="@+id/View01" android:layout_height="20dip" android:layout_width="1in" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View>
<TextView android:layout_width="wrap_content" android:textSize="22sp" android:layout_height="wrap_content" android:text="160sp" android:padding="5sp" android:id="@+id/TextView01"></TextView>
<View android:layout_marginLeft="20sp" android:layout_width="160sp" android:id="@+id/View04" android:background="#FF22FF22" android:layout_height="20dip"></View>
<TextView android:layout_width="wrap_content" android:textSize="22sp" android:layout_height="wrap_content" android:padding="5sp" android:id="@+id/TextView02" android:text="160px"></TextView>
<View android:layout_marginLeft="20sp" android:id="@+id/View03" android:background="#FF22FF22" android:layout_height="20dip" android:layout_width="160px"></View>
<TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="25.4mm"></TextView>
<View android:id="@+id/View02" android:layout_height="20dip" android:layout_marginLeft="20sp" android:background="#FF22FF22" android:layout_width="25.4mm"></View>
</LinearLayout>
Изменить: Добавлено еще 2 устройства для примера Джона. Слева - Samsung Nexus S (OS 2.3.3). Справа - Samsung Galaxy Tab 10.1 (ОС 3.1). Нет модов.
В Nexus S 160dp немного больше 1 дюйма. Все нормальные физические единицы (в, мм, pt) имеют одинаковый размер. Я измерил его с помощью линейки, а ширина 160 дп примерно на 1 мм больше, чем следовало бы. В то время как физические единицы на 1 мм короче, чем они должны.
На вкладке все бары точно совпадают, а на 1 мм длиннее, чем я измерял с помощью линейки.
Ответ 2
В документации говорится, что 160 дп (плотность не зависит) составляет 1 дюйм. И 72 pt также 1 дюйм.
Нюансом здесь является то, что 160 dp
(или dip
) примерно 1 дюйм, а 72 pt
точно 1 дюйм. Разница заключается в том, как андроид преобразует обе единицы в пиксели, что зависит от плотности экрана устройства.
Один dp
представляет собой одиночный px
на устройстве с разрешением 160 dpi. 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
to px
преобразует следующую формулу: dp * scaler = px
.
Единственный pt
составляет ровно 1/72 дюйма на любую плотность экрана. Android конвертирует pt
в px
с помощью точных dpi (xdpi и ydpi) экрана устройства.
pt
to px
преобразует следующую формулу: pt / 72 * dpi = px
.
Поэтому я не понимаю, почему android определяет измерение dp, пока он, похоже, работает так же, как точки. Может кто-нибудь объяснить это? Почему я должен использовать dp, если я могу использовать pt?
Взять пример, отобразите 160 dp
и 72 pt
на устройстве с разрешением 160 точек на дюйм. Устройство с разрешением 160 точек на дюйм попадает в ведро плотности mdpi с масштабируемым значением 1.0. Используйте приведенные выше формулы для преобразования в px
.
160 dp * 1.0 = 160 px
72 pt / 72 * 160 = 160 px
Как насчет устройства с разрешением 170 точек на дюйм? Устройство с разрешением 170 точек на дюйм попадает в ведро плотности mdpi с масштабируемым значением 1.0.
160 dp * 1.0 = 160 px
72 pt / 72 * 170 = 170 px
Как насчет устройства с разрешением 150 точек на дюйм? Устройство с разрешением 150 точек на дюйм попадает в ведро плотности mdpi с масштабируемым значением 1.0.
160 dp * 1.0 = 160 px
72 pt / 72 * 150 = 150 px
Мораль истории такова: dp
сохраняет точные размеры и помогает поддерживать производительность, позволяя некоторые изменения физического размера в зависимости от плотности устройства. С другой стороны, pt
является точно таким же физическим размером для каждой плотности, что приводит к использованию другого количества px
, что может помешать работе и вызвать сглаживание и артефакты, если они используются на изображениях. dp
рекомендуется, если не требуются абсолютно точные физические размеры (у вас есть линейка на экране и т.д.).
Я написал подробный блог на блоках измерения Android, который дает больше информации и пример кода - Понимание независимости плотности в Android
Ответ 3
Из любопытства я попробовал макет от Джона ответить на двух моих устройствах: Asus Transformer (10,1 дюйма) и HTC Legend (3,2 дюйма). Результаты были довольно интересными:
Трансформатор (обрезанный):
И легенда:
Ответ 4
Я боролся с измерениями, но я думаю, что нашел способ взглянуть на это, что имеет смысл для меня. Там формула преобразования в Wei-Meng Lee "Начало разработки приложений Android 4" (стр. 111):
Фактические пиксели = dp * (dpi/160), где dpi - 120, 160, 240 или 320
Итак, используя эту формулу, я могу найти, какие dpi для моего телефона/эмулятора ближе всего к одному из этих четырех значений, и это определит соотношение (3/4, 1, 3/2 или 2), используемое в формулу для преобразования dp в пиксели. Для меня важно, что dpi в формуле может принимать только одно из этих четырех значений, несмотря на фактическую плотность пикселей устройства.
Ссылаясь на: http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density, для Nexus S с плотностью пикселей 235 dpi преобразование:
pixels = dp * 3/2
Итак, кнопка 160dp, скажем, будет 240px (чуть шире дюйма с устройством 235 dpi)
Для HTC Legend с плотностью пикселей 181 dpi формула:
pixels = dp * 1
(поскольку 181 ближе всего к 160). Так что кнопка 160dp будет 160 пикселей или чуть меньше дюйма на устройстве с плотностью пикселей 181dpi.
Это помогает мне понять неправильность предыдущей документации для Android "1 dp всегда будет равным 1/160in, независимо от плотности экрана".
Это два основных момента, которые я пытаюсь получить в своей голове:)
- диапазон фактических плотностей пикселей устройства (например: 141-199) приведет к тому же соотношению (1) в формуле преобразования
- но если плотность пикселей конкретного устройства не равна 160 dpi, то 160 dp не будет дюймом на устройстве... закрыть выше или ниже, но не точно
Ответ 5
пт Точки - 1/72 дюйма в зависимости от физического размера экрана.
дп Плотно-независимые пиксели - абстрактный блок, основанный на физической плотности экрана. Эти единицы относятся к экрану с разрешением 160 точек на дюйм, поэтому один пиксель составляет один пиксель на экране с разрешением 160 точек на дюйм. Отношение dp-to-pixel будет меняться с плотностью экрана, но не обязательно в прямой пропорции. Примечание. Компилятор принимает как "dip", так и "dp", хотя "dp" более соответствует "sp".
Ответ 6
Почему я должен использовать dp, если я могу использовать pt?
Разработчики привыкли думать о вещах в терминах пикселей. Независимые от плотности пиксели были способом Android приближаться к тому, к чему привыкли разработчики. При этом вы можете использовать точки, дюймы или миллиметры, если хотите.
Ответ 7
1 dp всегда будет равным 1/160 дюйма, независимо от плотности экрана.
Это не так, как показано в приложении... Согласен?
BR Стен