Разница между размерами Android: pt и dp - PullRequest
50 голосов
/ 12 июля 2011

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

Ответы [ 7 ]

72 голосов
/ 12 июля 2011

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

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

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

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

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

UPDATE:

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

HTC Aria resource type test

Интересно отметить, что эти размеры НЕ совпадали точно в графическом редакторе Eclipse. Размеры dp и sp колебались в зависимости от размера экрана и разрешения в редакторе. Вот несколько скриншотов из редактора (слева 2,7-дюймовый слайдер QVGA, справа 10,1-дюймовый 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 (ОС 2.3.3). Справа - Samsung Galaxy Tab 10.1 (ОС 3.1). Нет модов.

Samsung Nexus S Samsung Galaxy Tab 10.1

На Nexus S 160dp немного больше, чем 1 дюйм. Все нормальные физические единицы (дюймы, мм, пт) имеют одинаковый размер. Я измерил его линейкой, и полоса 160 dp примерно на 1 мм больше, чем должна. В то время как физические единицы на 1 мм короче, чем должны.

На вкладке все стержни точно такие же, и на 1 мм длиннее, чем я измерил линейкой.

38 голосов
/ 23 апреля 2013

В документации сказано, что 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

3 голосов
/ 27 декабря 2012

pt Точки - 1/72 дюйма в зависимости от физического размера экрана.

dp Плотность-независимые пиксели - это абстрактные единицы, основанные на физической плотности экрана.Эти единицы относятся к экрану с разрешением 160 точек на дюйм, поэтому на экране с разрешением 160 точек на дюйм один пиксель составляет один пиксель.Отношение dp к пикселю будет меняться в зависимости от плотности экрана, но не обязательно в прямой пропорции.Примечание: компилятор принимает и «dip», и «dp», хотя «dp» более соответствует «sp».

3 голосов
/ 13 июля 2012

Я боролся с измерениями, но я думаю, что нашел способ взглянуть на него, который имеет смысл для меня. В «Начале разработки приложений для Android 4» Вей-Мэн Ли есть формула преобразования: стр. 111):

Фактические пиксели = dp * (dpi / 160), где dpi равно 120, 160, 240 или 320

Итак, используя эту формулу, я могу определить, какое значение dpi для моего телефона / эмулятора наиболее близко к одному из этих четырех значений, и это определит соотношение (3/4, 1, 3/2 или 2), используемое в формула для преобразования дп в пиксели. Для меня важно, что dpi в формуле может принимать только одно из этих четырех значений, несмотря на фактическую плотность пикселей устройства.

Ссылаясь на: http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density, для Nexus S с плотностью пикселей 235 dpi, преобразование составляет:

пикселей = dp * 3/2

Таким образом, кнопка 160dp, скажем, будет 240px (немного шире, чем дюйм при 235 dpi устройства)

Для HTC Legend с плотностью пикселей 181 dpi формула имеет вид:

пикселей = дп * 1

(потому что 181 ближе всего к 160). Таким образом, кнопка 160 dp будет иметь размер 160 пикселей или чуть меньше дюйма на устройстве с плотностью пикселей 181 точек на дюйм.

Это помогает мне понять неверность предыдущей документации по Android "1 дп всегда будет равен 1 / 160in, независимо от плотности экрана".

Вот два основных момента, которые я пытаюсь понять:)

  1. диапазон фактических плотностей пикселей устройства (например: 141-199) приведет к тому же отношению (1) в формуле преобразования
  2. , но если плотность пикселей конкретного устройства точно не равна 160 dpi, 160 dp не будет дюймом устройства ... близко выше или ниже, но не точно
3 голосов
/ 12 июля 2011

Из любопытства я попробовал макет из ответа Джона на двух моих устройствах: Asus Transformer (10,1 дюйма) и HTC Legend (3,2 дюйма).Результаты оказались довольно интересными:

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

Transformer

И Legend:

Legend

2 голосов
/ 12 июля 2011

Зачем мне использовать dp, если я могу использовать pt?

Разработчики привыкли думать о вещах в терминах пикселей. Плотно-независимые пиксели были способом Android приблизиться к тому, к чему привыкли разработчики. При этом вы можете использовать точки, дюймы или миллиметры, если хотите.

1 голос
/ 13 августа 2011

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

Это не так, как показано в вашей заявке ... Согласен?

BR Sten

...