Рубрики
3. Инструментарий Java

Density independent pixel (dp) в Android

Вопрос про единицу измерения длины "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 и т.д.) - количество точек на экране (например: 1024x720).
  • Плотность (DPI) - количество точек на линейный дюйм. В Android-е это разные группы: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high).

Итак понятно, что единица dp - это такой виртуальный пиксель, который на плотных экранах занимает большее количество пикселей, а на разреженных меньше.
Цель - сохранить единообразие в пользовательском интерфейсе.

Дальше самое интересное. Чтобы лучше понять, как происходит преобразование dp в px на самом деле, думаю имеет смысл посмотреть в исходный код:

Рубрики
Java

JavaZone 2012 - трейлер

Очередное видео про java от JavaZone !

Осторожно, ненормативная лексика!

Paper money is obsolete, it's all bits and bytes these day!

Рубрики
3. Инструментарий Java

SOAP. Посмотреть конверты.

Пару простых хинтов для тех, кто начинает изучать работу с SOAP.

Java 6

С тех пор как вышел JDK 6 (декабрь 2006г) веб-сервисы стали доступны из "коробки". В итоге начинать изучение работы с ними стало намного легче, без томкатов, жбоссов, глассфишей и других больших серверов.

Учебных материалов по работе с веб-сервисами существует огромное количество. В этой статье я хотел только привести два популярных и полезных JVM ключа.

Дампим отсылку SOAP-сообщения на консоль со стороны клиента:

-Dcom.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true

Дампим отсылку SOAP-сообщения на консоль со стороны сервера:

-Dcom.sun.xml.ws.transport.http.HttpAdapter.dump=true

Прокси

Другой способ для отладки - использовать прокси.
Я в работе использую Fiddler. Думаю этот инструмент хорошо знаком большему количеству веб-разработчиков.
С его помощью можно отслеживать запросы, эмулировать работу на медленных соединениях и т.д.

Например, если вы работает по SOAP из standalone-приложении (Java 6), то, настроив системные свойства для прокси, можно через Fiddler просматривать что отправляется на самом деле:

// или -Dhttp.proxyHost= и т.д.
System.setProperty("http.proxyHost", "localhost");
System.setProperty("http.proxyPort", "8888");
// ВАЖНО! Чтобы локалхост не исключил.
System.setProperty("http.nonProxyHosts", "");

Замечания

Если вы используете Аxis или какую-то другую библиотеку для работы с SOAP, то естественно настраивать дамп конвертов нужно будет другим способом. В этом плане подход с использованием прокси более универсальный. Тем не менее, изучать способ настройки прокси всё-равно нужно будет под конкретный фреймворк.