Вопрос про единицу измерения длины “dp” постоянно появляется на различных форумах и сайтах посвященных разработке приложений под ОС Android.
В большинстве случаев, в качестве ответа более опытные программисты приводят цитату с официального сайта:
Density-independent pixel (dp)
A virtual pixel unit that you should use when defining UI layout, to express layout dimensions or position in a density-independent way.
The density-independent pixel is equivalent to one physical pixel on a 160 dpi screen, which is the baseline density assumed by the system for a “medium” density screen. At runtime, the system transparently handles any scaling of the dp units, as necessary, based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels. You should always use dp units when defining your application’s UI, to ensure proper display of your UI on screens with different densities.
В целом, мотивы создания dp-единицы описаны довольно ясно. Никому не хочется делать множество различных версток для экранов с разным разрешением и плотностью точек.
Тем не менее, давайте посмотрим более подробно на указанную выше формулу:
px = dp * (dpi / 160)
Здесь главное не запутаться. Если px – это длина в пикселях, а dp – длина в д-пикселях, то для dpi = 240 получится:
px = (dpi/160) * dp = 1.5 * dp
По указанной выше формуле получим, что если dp = 1, то px = 1.5.
Попробуем разобрать ситуацию по существу. Ввод единицы измерения длины dp, нужен был для того, чтобы на экранах с разным количество точек на дюйм размеры графических элементов были одинаковыми.
Например, если взять экран с 160dpi (160 точек на линейный дюйм) и с 240dpi, то для того, чтобы физический размер кнопки был одинаковый, нужно на экране с 240dpi размер кнопки в пикселях делать в 1.5 раз больше.
Здесь важно определиться в понятиях размер, разрешение и плотность:
- Размеры (3”, 10” и т.д.) – физические размеры экрана. В Android-е это разные группы ресурсов: small, normal, large, and extra large. Измеряются в dp.
- Разрешение (QWGA, HVGA и т.д.) – количество точек на экране (например: 1024×720).
- Плотность (DPI) – количество точек на линейный дюйм. В Android-е это разные группы: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high).
Итак понятно, что единица dp – это такой виртуальный пиксель, который на плотных экранах занимает большее количество пикселей, а на разреженных меньше.
Цель – сохранить единообразие в пользовательском интерфейсе.
Дальше самое интересное. Чтобы лучше понять, как происходит преобразование dp в px на самом деле, думаю имеет смысл посмотреть в исходный код:
(далее…)