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

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


person Herbert    schedule 11.07.2011    source источник
comment
Документация Android была обновлена, чтобы удалить неверное утверждение о том, что 160 dp равняется 1 дюйму.   -  person Intrications    schedule 17.03.2012


Ответы (7)


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

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

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

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

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

ОБНОВЛЕНИЕ:

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

Тест типа ресурса HTC Aria

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

Samsung Nexus SВкладка Samsung Galaxy 10.1

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

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

person John Leehey    schedule 11.07.2011
comment
Пиксель зависит от плотности, но DP означает независимость от плотности. Из документации: так что 160dp всегда один дюйм независимо от плотности экрана - person Herbert; 12.07.2011
comment
На самом деле, Герберт, я тоже не уверен, что мой первоначальный обновленный пост верен. Я думаю, что 320 dp всегда будет равняться 2 дюймам, независимо от экрана. Я снова обновляю свой пост. - person John Leehey; 12.07.2011
comment
Да, я был в замешательстве. Может я что-то упустил, но вроде 1 DP = 160/72 pt - person Herbert; 12.07.2011
comment
Да, я думаю, ты прав. Мне это интересно, я не знал, что обе переменные не зависят от плотности. - person John Leehey; 12.07.2011
comment
Кажется, я понимаю дизайнерское решение сделать новый блок дп. Потому что смартфоны в основном имеют гораздо более высокую плотность (PPI), чем компьютеры. А при использовании точек шрифт в девките, визуальном режиме будет выглядеть намного крупнее, чем на смартфоне. - person Herbert; 12.07.2011
comment
@ Герберт, я хотел проверить типы ресурсов на реальном устройстве. Проверьте мой обновленный пост. - person John Leehey; 12.07.2011
comment
Кстати Герберт, 1 DP = 72/160 pt :D - person John Leehey; 13.07.2011
comment
1 dp всегда будет равен 1/160 дюйма, независимо от плотности экрана. Это неверно, документация Android неверна. Вы сами продемонстрировали это на выходе из редактора Eclipse. - person Intrications; 20.10.2011
comment
@Ashton, мне было интересно, неправильный ли редактор eclipse, потому что я не видел этого результата на устройстве. Я знаю, что редактор должен использовать тот же механизм рендеринга, но я не хочу говорить, что документация неверна, если только я не получу результат на стандартном телефоне. - person John Leehey; 21.10.2011
comment
@Ashton Я обновил свой ответ, чтобы лучше отразить реальные результаты измерений. - person John Leehey; 22.10.2011
comment
@John Документация Android теперь обновлена, чтобы удалить неверное утверждение о том, что 160 dp равняется 1 дюйму. Я обновил ваш ответ, чтобы отразить новую документацию, поскольку это ответ, который люди будут читать, поскольку он самый высокий. Я заменил первую часть, которая была неверной - даже скриншоты во второй половине вашего ответа показали это, и документация Android теперь верна. - person Intrications; 17.03.2012
comment
@ Эштон, спасибо, я рад, что они уладили проблему. - person John Leehey; 19.03.2012
comment
Можете ли вы, наконец, решить, какой блок использовать, чтобы сделать приложения совместимыми с устройствами всех размеров ?? дп или пикс или пт?? - person Nagappa L M; 25.11.2013
comment
@NagappaLM, нет прямого устройства, которое волшебным образом делает все приложения совместимыми с устройствами любого размера. Вам нужно будет использовать здравый смысл, следуя рекомендациям по сегрегации макета Android. Если вам нужны точные размеры (например, ровно 1 дюйм), используйте pt, mm или in, но если вы хотите, чтобы макеты выглядели одинаково по удобочитаемости, используйте dp (или sp для текста). Ответ Стивена хорошо объясняет это. - person John Leehey; 25.11.2013
comment
Спасибо за ответ - person Nagappa L M; 27.11.2013
comment
вы сказали, что 160 dp НЕ всегда будет равно 1 дюйму, оно будет варьироваться в зависимости от размера экрана и плотности, но 160 dp — это ровно один дюйм на каждом устройстве и мониторе по всему космосу. - person EN20; 25.04.2015
comment
На моем телефоне LG я получил 1 дюйм = 138dp, используя следующий код. дюйм * metrics.xdpi / metrics.density; - person ; 10.02.2020

В документации сказано, что 160 dp (независимо от плотности) равняется 1 дюйму. А 72 пт тоже 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 в px преобразуется по следующей формуле: dp * scaler = px.


Одно pt равно 1/72 дюйма при любой плотности экрана. Android преобразует pt в px, используя точное значение dpi (xdpi и ydpi) экрана устройства.

pt в px преобразуется по следующей формуле: pt / 72 * dpi = px.


Поэтому я не понимаю, почему Android определяет измерение dp, хотя оно, кажется, работает так же, как точки. Кто-нибудь может это объяснить? Зачем мне использовать dp, если я могу использовать pt?

Возьмем, к примеру, отображение 160 dp и 72 pt на устройстве с разрешением 160 dpi. Устройство с разрешением 160 dpi попадает в корзину плотности mdpi с коэффициентом масштабирования 1,0. Используйте приведенные выше формулы для преобразования в px.

160 dp * 1.0 = 160 px
72 pt / 72 * 160 = 160 px

А как насчет устройства с разрешением 170 dpi? Устройство с разрешением 170 dpi попадает в корзину плотности mdpi с коэффициентом масштабирования 1,0.

160 dp * 1.0 = 160 px
72 pt / 72 * 170 = 170 px

Как насчет устройства с разрешением 150 dpi? Устройство с разрешением 150 dpi попадает в корзину плотности mdpi с масштабированием 1,0.

160 dp * 1.0 = 160 px
72 pt / 72 * 150 = 150 px

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

Я написал подробный блог о единицах измерения Android, в котором содержится дополнительная информация и примеры кода — Понимание Независимость от плотности в Android

person Steven Byle    schedule 23.04.2013
comment
как насчет 5,1 дюйма до 5,4 дюйма (sw480dp) - person cammando; 26.05.2017
comment
@cammando физический размер != sw###dp != dpi. Прочтите мой блог, он должен помочь вам понять различия. - person Steven Byle; 26.05.2017

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

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

Трансформатор

И Легенда:

Легенда

person howettl    schedule 12.07.2011
comment
Это действительно интересно для меня, потому что у меня сложилось впечатление, что HTC Legend был таким же, как HTC Aria... странно!! - person John Leehey; 12.07.2011
comment
Неважно ... Я только что понял, что использую освобожденную прошивку Legend 2.2, и хотя они были одинаковыми из-за этого: P - person John Leehey; 12.07.2011
comment
Смешной. Согласно Википедии: HTC Aria имеет то же программное обеспечение, что и HTC Desire и HTC Legend, но у Legend нет емкостных кнопок. Интересно, в чем причина разницы? Я использую Cyanogenmod на своей легенде. - person howettl; 12.07.2011
comment
Тогда это должно быть как-то связано с ПЗУ. Я могу попробовать прошивку Cyanogenmod на своей арии, она у меня уже есть на SD, но какое-то время не смогу. - person John Leehey; 12.07.2011
comment
Transformer имеет разрешение 160 dpi, поэтому в данном случае 160 dp действительно составляет 1 дюйм, поэтому все линии имеют одинаковую длину. - person Intrications; 17.03.2012

Я боролся с измерениями, но я думаю, что нашел способ смотреть на это, который имеет для меня смысл. В статье Wei-Meng Lee «Начало разработки приложений для 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 преобразование:

пиксели = дп * 3/2

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

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

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

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

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

Это два основных момента, которые я пытаюсь вбить себе в голову :)

  1. диапазон фактической плотности пикселей устройства (например: 141-199) приведет к тому же коэффициенту (1) в формуле преобразования
  2. но если плотность пикселей конкретного устройства составляет ровно 160 точек на дюйм, 160 точек на дюйм не будут на дюйм на устройстве ... закрыть выше или ниже, но не совсем
person gcbound    schedule 13.07.2012

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

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

person Subayan    schedule 27.12.2012

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

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

person CommonsWare    schedule 11.07.2011
comment
Однако, если вы предпочитаете использовать точки, дюймы или миллиметры, у вас возникнет больше проблем с масштабированием вашего приложения для разных размеров экрана. - person Intrications; 20.10.2011
comment
@AshtonBRSC, почему так? скажем, я делю все свои dip на 160 и меняю dip на inch, какая разница, чем ? - person Pacerier; 21.10.2011
comment
@Pacerier Я думаю, он имеет в виду, что если вы сделаете все свои размеры в дюймах, они всегда останутся в этом размере. Другими словами, 1-дюймовая кнопка на крошечном 3,5-дюймовом телефоне по-прежнему будет 1-дюймовой на 10-дюймовом планшете (где вы можете захотеть, чтобы кнопка была немного больше). - person John Leehey; 22.10.2011
comment
@John Я имею в виду, если я разделю все свои dip на 160, умножу на 72 и изменю dip на pt, какая разница, чем ? - person Pacerier; 22.10.2011
comment
@Pacerier, согласно документации Android, нет никакой разницы, но если вы прочитаете мой ответ и ответ Howettl, то, по-видимому, существует какая-то нестыковка между тем, что должен отображать экран, и тем, что он на самом деле отображает для некоторых устройств. - person John Leehey; 24.10.2011
comment
@Джон, да, это то, о чем я говорил. Это dip с ошибками или pt с ошибками? - person Pacerier; 25.10.2011
comment
@Pacerier, честно говоря, я не знаю, потому что по скриншотам вы не можете сказать, что на самом деле является мерой 1 дюйма. Однако pt постоянно совпадает с in. - person John Leehey; 25.10.2011
comment
@ Джон, чтобы перефразировать ваш комментарий выше, вы имеете в виду, что pt предпочтительнее dip? - person Pacerier; 26.10.2011
comment
@Pacerier, что предпочтительнее, зависит от пользователя, но что является наиболее точным, на данный момент не определено, потому что в этих сообщениях нет реальных сравнений. Например, в сообщении Howettls откуда мы знаем, что измерение dp не соответствует реальному дюйму, а измерения pt и in не являются неправильными? Нужна линейка... но если предположить, что измерение in всегда правильное, то оказывается, что pt будет более точным для измерения точной длины. - person John Leehey; 27.10.2011
comment
@ Джон, я имею в виду, что плохого в использовании линейки? Я запустил эмулятор с точным размером, поэтому он должен быть ровно один дюйм для вас на экране, верно? - person Pacerier; 28.10.2011
comment
@Pacerier, нет ничего плохого в использовании линейки, у меня ее просто нет ... если вы хотите проверить, что правильно, а что нет, вперед! - person John Leehey; 29.10.2011

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

Это не так, как показано в вашем приложении... Согласны?

БР СТЭН

person STeN    schedule 13.08.2011
comment
Вы правы, 1 dp будет варьироваться в зависимости от устройства. Документация Android неверна, когда говорится, что 160dp всегда составляет один дюйм, независимо от плотности экрана. - person Intrications; 20.10.2011
comment
Ужасно, чтобы приложение корректно работало на разных планшетах и ​​разных версиях ОС... iPad с этой точки зрения намного проще... - person STeN; 20.10.2011
comment
iOS на данный момент проще, но Apple ограничена в разрешениях экрана, которые она может предложить, используя свою текущую систему компоновки. Вот почему iPhone 4 имел разрешение ровно в два раза больше размера — так что можно было использовать те же макеты с абсолютным позиционированием. Макеты iPhone нельзя повторно использовать на iPad, но с Android макеты телефона можно использовать на планшетах. Android гораздо более гибкий, просто нужно немного больше работы. И это помогло бы, если бы в документации не было таких ошибок. - person Intrications; 20.10.2011
comment
@STeN, так вы говорите, что мы должны использовать дюйм или дп? - person Pacerier; 21.10.2011
comment
@Pacerier Никогда не используйте дюйм, если вы не делаете что-то вроде размещения линейки на экране, которая действительно должна быть определенного размера в дюймах. Размеры экрана Android варьируются от 2,5 дюймов до более 10 дюймов, поэтому вы получите макеты, которые выглядят ужасно на экранах большинства размеров. По сути, просто всегда используйте dp и sp, если вы не знаете, почему вы используете другую единицу измерения. - person Intrications; 02.11.2011