Подтвердить что ты не робот

Разница между размером андроида: pt и dp

В документации говорится, что 160 дп (плотность не зависит) составляет 1 дюйм. И 72 pt также 1 дюйм. Поэтому я не понимаю, почему android определяет измерение dp, пока он работает так же, как точки. Может кто-нибудь объяснить это? Почему я должен использовать dp, если я могу использовать pt?

4b9b3361

Ответ 1

В документации для Android неправильно указано, что 160 dp всегда равно 1 дюйм независимо от плотности экрана. Это было сообщено как ошибка которая была принята и обновлена ​​документация.

Из обновленной документации:

160 dp НЕ всегда будет равным 1 дюйму, он будет меняться в зависимости от размеров и плотности экрана. На экране с плотностью 160dpi (mdpi) 160 dp будет равно 1 дюйм.

1 pt всегда будет равным 1/72 дюйма, независимо от плотности экрана.

Документация для Android для этого здесь.

UPDATE:

Я сделал небольшое приложение, чтобы попытаться проверить разные размеры. Похоже, что выше, правильно, по крайней мере, когда показано на моем HTC Aria. Вот скриншот:

HTC Aria resource type test

Интересно отметить, что эти размеры НЕ совпадали точно в графическом редакторе eclipse. Размеры dp и sp колебались в зависимости от размера экрана и разрешения в редакторе. Вот несколько скриншотов из редактора (слева - 2.7in QVGA слайдер, справа - 10.1in WXGA, обрезанный):

enter image description here

Было бы интересно посмотреть, соответствуют ли эти редакторы реальным устройствам. Может ли кто-нибудь проверить эти размеры? Я приложу свой 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). Нет модов.

Samsung Nexus SSamsung Galaxy Tab 10.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 дюйма). Результаты были довольно интересными:

Трансформатор (обрезанный):

Transformer

И легенда:

Legend

Ответ 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 Стен