Что такое DPI в телефоне и на что это влияет
Ядра, гигагерцы, гигабайты мегапиксели – это стандартные термины для 21 века, которые слышал ну практически каждый. По отдельности они могут использоваться в самых разных отраслях, однако вместе встречаются только применительно к смартфонам. Но если раньше относящиеся к ним цифры было принято знать практически наизусть, то сегодня в этом практически нет никакого смысла. В конце концов, какая разница, на какой частоте работает процессор вашего смартфона, если он работает хорошо и не тормозит? Другое дело, что есть ещё показатели, которые лучше знать наизусть.
DPI и PPI — суть то же самое, но не совсем
Что такое ярлыки на Android, зачем они нужны и как ими пользоваться
Я говорю о DPI (dots per inch). В переводе на русский язык этот термин обозначает количество точек на дюйм. По своей сути он довольно близок к PPI (pixels per inch) – количеству пикселей на дюйм. И тот, и другой обозначают разрешающую способность. Но если PPI – это цифровой показатель, который демонстрирует, сколько пикселей может поместиться на каждый квадратный дюйм дисплея, то DPI – это, скорее, характеристика картинки, которой предстоит отображаться на каком-то экране.
Зачем нужен DPI

Скачивая APK-файлы приложений, обращайте внимание на графу DPI
DPI играет большое значение для приложений. Некоторые разработчики изначально адаптируют свой софт под конкретную плотность точек на дюйм: 120, 160, 200, 300 и больше. Это значит, что приложению для работы требуется, чтобы экран смартфона обладал таким разрешением, чтобы его показатель PPI в точности совпадал с показателем DPI. От этого зависит, будет ли приложение работать на устройстве или не будет. Это важно знать, когда вы скачиваете приложения в виде APK-файлов на альтернативных Google Play площадках.
По факту, DPI – это показатель как бы графического объёма, который предстоит занять изображению, а PPI – это показатель как бы графической ёмкости, которой это изображение предстоит вместить.
На сайтах вроде APKPure и APKMirror, которые являются самыми популярными источниками софта из числа альтернативных, на странице каждого приложения разделе с характеристиками есть отдельная графа DPI. Чаще всего встречается обозначение nodpi, которое обозначает, что у приложения нет конкретных требований к вмещающей способности дисплея. Но иногда попадаются вполне конкретные цифры, и они обозначают, что разрешение дисплея должно давать плотность пикселей, равную заявленной разработчиком плотности точек.
Не устанавливается APK на Android
Я больше чем уверен, что большинство пользователей даже понятия не имеют, какой показатель PPI (DPI) имеет экран их смартфона. Это я сужу по себе. Нет, я знаю, какое разрешение у моего аппарата, но вот какую оно даёт плотность пикселей на выходе, даже не представляю. К счастью, высчитывать его самостоятельно, тем более что это довольно сложно, поскольку дисплеи современных устройств зачастую имеют форму не строгих прямоугольников, необходимости нет.
Как проверить DPI телефона
Для этой цели существует специальное приложение DPI Checker. Вот как оно работает:
- Скачайте приложение DPI Checker из Google Play;
- Запустите его и примите пользовательское соглашение;

DPI Checker — приложение, которое измеряет показатели DPI вашего смартфона
- На главной странице нажмите розовую кнопку измерения;
- Сравните полученный результат с требованиями APK-файла.
В моём случае, как видите, показатель DPI равен 480 точкам. Это стандарт для большинства смартфонов с диагональю дисплея 6,5 дюймов и разрешением Full HD+. То есть он ничем не отличается от любого другого аппарата со схожими характеристиками, а значит, должен поддерживать подавляющее большинство приложений. Если же показатель DPI вашего смартфона не соответствует требованиям приложения, выберите альтернативную версию apk, либо скачайте программу из Google Play – он сам подберёт нужную версию.

Теги
- Дисплей телефона
- Новичкам в Android
- Приложения для Андроид
Наши соцсети
Новости, статьи и анонсы публикаций
Android — советы и подсказки. Как узнать DPI вашего смартфона или планшета для скачивания подходящих версий APK файлов для них
Большинству более или менее опытных пользователей Android устройств хорошо известно, что устанавливать игры и приложения на них можно не только из онлайн магазина Google Play Маркет, но и из APK файлов, которые можно скачать с различных ресурсов.

Однако, зачастую они испытывают затруднения в том, чтобы скачать правильный APK файл для смартфона или планшета, оптимизированный под размер и разрешение его экрана или — плотность упаковки пикселей, которая обозначается аббревиатурой DPI. Сегодня я хочу поделиться с вами одним из способом, позволяющим узнать значение DPI дисплея вашего Android устройства.
Сделать это очень и очень просто.
Прежде всего вам нужно будет установить на свой смартфон или планшет бесплатное приложение Display Info от разработчика Stefano Sanna, которое доступно для скачивание с этой страницы Google Play Маркет.
После запуска Display Info отобразит информацию о параметрах дисплея вашего Android устройства (скриншот ниже, слева). Как вы уже поняли, нам потребуется значение DPI, которое отображается в строке «Density».
Теперь зная значение DPI экрана вашего смартфона или планшета, вы можете скачать подходящий вам вариант APK файла. Для этого вам нужно выбрать файл в описании которого DPI равно или выше (ближайшее значение) DPI полученного от приложения Display Info. Пример вы видите ниже:

Помимо этого, в отдельных случаях, если никакой из имеющихся вариантов вам не подходит, вы можете выбрать APK файл с пометкой «nodpi», который должен быть совместим с любым разрешением дисплея.
Похожие материалы:
В чем разница между квалификаторами -nodpi и -anydpi?
Директория ресурсов с квалификатором -nodpi предназначена для ресурсов, которые не зависят от плотности экрана. Система не масштабирует картинки из drawables-nodpi/ .
Квалификатор -anydpi был добавлен в API v21. Ресурсы из -anydpi подходят для всех конфигураций экрана. Приоритет -anydpi выше, чем у квалификаторов конкретной плотности экрана ( -hdpi , -mdpi , и т.д.). Как правило -anydpi используется для векторных картинок.
Drawable. Изображения, фигуры и градиенты
Android генерирует идентификаторы ресурсов для файлов изображений, расположенных в подкаталоге /res/drawable. Поддерживаются файлы PNG (самый предпочтительный), GIF, JPG. Для каждого файла изображения, который находится в этом каталоге, генерируется уникальный идентификатор на основе имени файла без расширения. Например, если у файла имя «cat.jpg», то для него будет создан идентификатор ресурса R.drawable.cat. Нужно следить за уникальностью имён, так как если у вас будут два файла «cat.jpg» и «cat.png», то возникнет ошибка. Кроме того, не нужно создавать дополнительных подкаталогов в папке res/drawable, так как файлы оттуда не будут считываться.
Можно адаптировать картинки для разных разрешений и размеров экранов. Для этого нужно создать специальные папки и складывать там нужные картинки. Например, для различных разрешений экрана используются папки drawable-hdpi, drawable-mdpi, drawable-ldpi и пр.. Существует аналогичное деление для размеров экрана: drawable-normal, drawable-large и т.д.. Можно совмещать эти способы и создавать папки типа drawable-normal-hdpi. Для изображений, которые должны оставаться неизменными вне зависимости от разрешения экрана, следует создать папку drawable-nodpi.
Для памятки приведу используемые размеры изображений для значков и фона экрана:
- res/drawable-ldpi — (120 DPI) (QVGA):
ic_launcher.png (значок), 36 × 36 background.png (фон), 320 × 240 pixels - res/drawable-mdpi — (160 DPI) (HVGA):
background.png, 320 × 480 - res/drawable-hdpi — (240 DPI) (WVGA):
ic_launcher.png, 72 × 72
background.png, 800 × 480 - res/drawable-xhdpi (320 DPI) (WSVGA or HDTV):
ic_launcher.png, 96 × 96
background.png, 1024 × 600 или 1280 × 720 pixels
Чтобы сослаться на изображение из res/drawable в XML-файлах разметки, используйте следующий синтаксис:
Обратите внимание, что в любом случае мы обращаемся к ресурсу как drawable, а не drawable-hdpi или как-то еще.
Программным способом можно достучаться до изображения следующим образом:
// вызываем getDrawable для получения изображения BitmapDrawable bd = activity.getResources().getDrawable(R.drawable.cat); // Затем можно использовать полученный объект, чтобы установить фон button.setBackgroundDrawable(bd); // или можно установить фон непосредственно по идентификатору ресурса button.setBackgroundResource(R.drawable.icon);
Android включает простые ресурсы для рисования, которые можно полностью описать в формате XML. Это касается классов ColorDrawable, ShapeDrawable и GradientDrawable. Данные ресурсы хранятся в каталоге res/drawable и могут быть идентифицированы в коде приложения по именам файлов, записанным в нижнем регистре.
Если описывать эти ресурсы в формате XML и указывать атрибуты для них с помощью аппаратно-независимых пикселей (density-independent pixels), система сможет их плавно масштабировать. Как и в случае с векторной графикой, эти ресурсы могут динамически масштабироваться, отображаясь корректно и без артефактов при любых размерах и разрешениях экрана, независимо от плотности пикселов. Исключение — ресурс GradientDrawable, радиус для которого должен быть указан в пикселях.
Получить имя ресурса
Иногда нужно получить не сам идентификатор, а его имя в виде R.drawable.cat, что сохранить его, скажем, в базе данных. Воспользуйтесь следующим приёмом:
getResources().getIdentifier("image_name","drawable", getPackageName()) getResources().getIdentifier("your.full.package.name:drawable/image_name", null, null);
Бывает и обратная задача — из имени ресурса получить идентификатор. Тот же принцип.
String mDrawableName = "cat1"; // файл cat1.png в папке drawable int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());
Строго говоря это относится не только к типу drawable, но обычно приходится встречаться с проблемой именно для них.
(класс AnimatedRotateDrawable)
Ресурсы для создания эффекта вращения.
| Атрибут | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
| visible | boolean | parent|true | Determines if drawable is visible. |
| frameDuration | integer | 150 | The duration of each frame, in milliseconds. |
| framesCount | integer | 12 | Number of frames of rotation to animate. |
| pivotX | float|fraction | .5 | The pivot point, as a fraction of the width. |
| pivotY | float|fraction | .5 | The pivot point, as a fraction of the height. |
| drawable | reference | null | The drawable to use for this item. Either this must be present or a drawable subelement must exist. |
(класс AnimationDrawable)
Вращение по кадрам. Нужно подготовить несколько похожих изображений, которые будут сменять друг друга.
| Атрибут | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
| visible | boolean | parent|true | Determines if drawable is visible. |
| variablePadding | boolean | false | If true, allows the drawable’s padding to change based on the current state that is selected. |
| oneshot | boolean | false | If true, the animation will only run a single time and then stop. |
Если у нас имеется несколько изображений одного ProgressBar

(класс BitmapDrawable)
Позволяет использовать растровые изображения и проделывать с ними различные операции: растягивать, размножать, выравнивать. Часто используется в составе других ресурсов. Смотри примеры ниже.
Основной атрибут src, в котором указывается файл изображения.
Атрибут gravity позволяет управлять размещением картинки внутри контейнера. Можно использовать несколько значений, разделенных знаком |: top, left, center, fill и др.
У него также есть интересный атрибут tileMode, позволяющий замостить изображением всё доступное пространство. Можно использовать значения repeat, mirror, clamp. Пример есть выше по ссылке.
Другие атрибуты: antialias (сглаживание), dither (преобразование цветов, если текущей палитры недостаточно для отображения), filter (фильтр при сжатии или растягивании), mipMap.
В Android 5.0 (API 21) у bitmap появился новый атрибут android:tint, позволяющий задавать оттенки.
(класс ClipDrawable)
Данный вид ресурсов часто используется для создания индикаторов прогресса.
Тег clip позволяет обрезать Drawable по горизонтальной или по вертикальной оси через атрибут clipOrientation.
Атрибут gravity позволяет указать направление обрезания. Значения атрибута можно комбинировать. Например, если у clipOrientation значение равно vertical, а у gravity — top, то отрежется нижняя часть изображения.
Создадим файл res/drawable/clipping.xml
Присвоим созданный ресурс компоненту ImageView:
Сама обрезка производится программно через метод setLevel() с диапазоном значений от 0 до 10000, где 0 — картинка полностью обрезана и не видна, 10000 — картинка видна полностью.
public void onClick(View view)
В примере обрезается правая часть по центру, оставляя видимой левую часть картинки.

Чтобы оставить только четвертинку (левую верхнюю часть), изменим атрибуты

Следующая комбинация отрежет лишнее слева и справа, оставив только центральную часть изображения.
(класс ColorDrawable)
Цветовые ресурсы используются в виде значений в папке res/values, например, в файле colors.xml. Но можно обращаться к цвету, как drawable-ресурсу.
android:drawable="@color/green"
(Класс InsetDrawable)
Пример создания объёмной панели с помощью inset.
(класс LayerDrawable)
Можно задавать не только простые формы, но и их комбинации. Для этого служит класс LayerDrawable, позволяющий накладывать несколько объектов Drawable один поверх другого. Описав массив полупрозрачных объектов Drawable, вы можете создать сложную комбинацию динамических фигур и преобразований.
LayerDrawable описывается с помощью тега , внутри которого для каждого дочернего узла используется атрибут drawable, указывающий на ресурс для наложения.
Каждый объект Drawable будет накладываться в соответствии со своим индексом — первый элемент массива размещается в самом низу.
Переделаем пример программного использования LayerDrawable на пример с использованием XML. Создадим в папке res/drawable файл layerdrawable.xml:
Осталось применить к макету, при этом нам не нужен метод из примера по ссылке.
LinearLayout linear = (LinearLayout)findViewById(R.id.linear); //linear.setBackground(createLayerDrawable()); linear.setBackgroundResource(R.drawable.layerdrawable); // с помощью XML
Кнопка с бликом
Рассмотрим другие примеры. Например, можно создать такую кнопку с бликом.

Марка
Можно даже создать изображение марки.

Тени
Создав два похожих объекта и сместив их относительно друг друга, вы можете реализовать эффект тени.

Кнопка-треугольник
Создадим кнопку треугольной формы. Файл res/drawable/arrow_up.xml.
Применим стиль к кнопке. Текст задавать не будем.
Если понадобится такая же кнопка с направлением вниз, то достаточно добавить атрибут android:rotation=»180″.

(класс TransitionDrawable)
Является расширением предыдущего layer-list и позволяет использовать наложение.
В теге transition указываются два объекта Drawable, между которыми можно переключаться с fade-эффектом и указанием продолжительности перехода.
(класс LevelListDrawable)
Используя LevelListDrawable, вы можете эффективно размещать ресурсы Drawable один поверх другого, указывая целочисленный индекс для каждого слоя.
Чтобы вывести на экран определенное изображение, вызовите метод setImageLevel() из представления, которому назначен ресурс LevelListDrawable, передавая в качестве параметра индекс объекта Drawable, который вы хотите отобразить.
imageView.setImageLevel(5);
Представление отобразит ресурс с соответствующим (или большим) индексом. Ресурс LevelListDrawable нужен при компоновке виджетов.
(класс NinePatchDrawable)
(класс RotateDrawable)
Данный ресурс позволяет повернуть изображение на нужный градус. Допустим, у вас есть стрелки в разные стороны. Совсем не обязательно создавать копии стрелок. Достаточно нарисовать одну стрелку, а в файлах прописать нужные повороты. Например, повернём значок приложения вверх тормашками в файле drawable/rotate_up.xml:
Присвойте атрибуту src компонента ImageView и вы увидите значок перевёрнутым.
- drawable — изображение для поворота
- fromDegrees — начальный угол поворота, в градусах. По умолчанию 0.0
- toDegrees — конечный угол поворота, в градусах. По умолчанию 360.0
- pivotX — опорная точка по X
- pivotY — опорная точка по Y
Опорная точка — это место для виртуальной булавки, вокруг которой будет вращаться пришпиленный листок. Для центра мы указали половину по высоте и ширине. Для неподвижной картинки углы поворота можно указать одинаковыми.
Тег rotate также используется в анимационных ресурсах, не путайте их.
(класс ScaleDrawable)
Позволяет масшабировать (сжать или расширить) изображение по горизонтальной (scaleWidth) и/или вертикальной (scaleHeight) оси и сместить полученное изображение в указанную часть (scaleGravity) доступного пространства.
(класс StateListDrawable)
У некоторых элементов управления есть различные состояния: нажато, выбрано и т.д.. Вы можете задавать изображения для любого из таких состояний.
Чтобы описать StateListDrawable, создайте файл в формате XML, в котором указываются разные ресурсы Drawable для каждого состояния компонента. Каждый атрибут вида android:state_* может принимать одно из двух значений: true или false.
Доступны следующие состояния:
- state_focused — в фокусе или нет
- state_window_focused — имеет ли фокус родительское окно
- state_enabled — доступен или нет
- state_checkable — может ли быть отмечен или нет
- state_checked — отмечен или нет
- state_selected — выделен или нет
- state_activated — активирован или нет
- state_pressed — нажат или не нажат
- state_hovered — находится ли курсор над компонентом или нет (API 11 и выше)
Для списков есть также:
- state_single
- state_first
- state_middle
- state_last
Рассмотрим примеры. Нас не устраивает внешний вид кнопки. Хочется, чтобы она выглядела так (Да еще и чтобы подсвечивалась при нажатии):

Сделать это просто. Добавляем в ресурсы изображения нормального (button_up.png) и нажатого (button_down.png) состояний кнопки. И создаём в папке drawables XML-файл со следующим содержанием (states_button.xml):
Важный момент: в списке состояний нужно сначала указывать специализированные состояния, а последним должно следовать состояние по умолчанию (без атрибутов state-* вообще).
Ещё один момент. Кнопка может одновременно находиться в состоянии pressed и focused, поэтому сначала указывайте state_pressed, а затем state_focused. Иначе, если кнопка будет в состоянии focused, то состояние pressed не применится.
Теперь осталось у атрибута background для кнопки прописать созданный ресурс.
Можно обойтись без использования изображений для кнопки, а воспользоваться фигурами (states_shapes.xml).

А можно использовать просто цвета:
Попробуйте применить файл не к атрибуту background, а к атрибуту android:textColor, чтобы цвет влиял на текст кнопки, а не на саму кнопку.
Можно использовать как шпаргалку следующую картинку.

RadioBox, CheckBox и др.
Похожим образом можно задавать стили для RadioButtom, CheckBox и т.п.. Но тут мало того, что можно отдельным ресурсом задавать фон, так отдельным же ресурсом можно задавать саму пиктограмму через атрибут button (states_compound.xml).
Разметка с созданными стилями

-nodpi, -anydpi
Есть очень интересная статья о папках с квалификаторами -nodpi, -anydpi — The CommonsBlog — -nodpi, -anydpi, and WTF?
Вкратце, nodpi для исключительных случаев, когда картинка нужного разрешения не найдётся. Например, у нас есть res/drawable-nodpi/foo.xml и res/drawable-xxhdpi/foo.png. Устройство с -xxhdpi должно использовать PNG; остальные — XML-версию.
Изображения в res/drawable-anydpi/ также подойдут для любого разрешения экрана, но работают по другому принципу. Например, у нас есть res/drawable-anydpi/foo.xml и res/drawable-xxhdpi/foo.png. Все устройства должны использовать XML, даже устройства с разрешением -xxhdpi. Поэтому квалификатор удобно использовать совместно с другими квалификаторами. В частности, с -v21, что полезно при работе с вектором.
Допустим, у нас есть res/drawable-anydpi-v21/foo.xml и res/drawable-xxhdpi/foo.png. В этом случае, все устройства 5.0+ будут использовать XML. Все xxhdpi-устройства на Android 4.4 и ниже будут использовать PNG. И все остальные устройства на Android 4.4 и ниже также будут использовать PNG, подгоняя картинку под своё разрешение.
Векторные файлы нельзя размещать в папке -nodpi, если minSdkVersion меньше 21.
Папка res/drawable/ по сути является синонимом для res/drawable-mdpi/ и была оставлена в целях совместимости, когда на первых устройствах ещё не было деления на разрешения экрана. Никто же не предполагал, что Android так разовьётся. Сейчас эту папку используют для xml-файлов, которые ведут себя достаточно независимо то разрешения экранов при правильном использовании.
Дополнительное чтение
О градиентах в отдельной статье
