Drawable xxhdpi что это
На этом шаге мы дадим краткую характеристику фалов проекта .
На рисунке 1 приведено содержание проекта.
Рис.1. Содержание проекта
Вкладка Android содержит две основные папки: app и Gradle Scripts . Первая папка app является отдельным модулем для приложения и содержит все необходимые файлы приложения — код, ресурсы картинок и т.п. Вторая папка служит для различных настроек, управления проектом и многих других вещей.
Сейчас нас должна интересовать папка app . Раскройте её. В ней находятся папки: manifests, java, res . manifests Папка manifests содержит единственный файл манифеста AndroidManifest.xml . В этом файле должны быть объявлены все активности, службы, приёмники и контент-провайдеры приложения. Также он должен содержать требуемые приложению разрешения. Например, если приложению требуется доступ к сети, это должно быть определено здесь. «AndroidManifest.xml» можно рассматривать, как описание для развёртывания Android -приложения.
java Папка java содержит три подпапки — одну рабочую и два для тестов. Рабочая папка имеет название вашего пакета и содержит файлы классов. Сейчас там один класс MainActivity . Папки для тестов можете не трогать. Если вы знаете, как работают пакеты в Java, то можете создавать новые папки и подпапки.
- drawable — в этих папках хранят графические ресурсы — картинки и xml -файлы, описывающие цвет и фигуры. В реальности на диске находятся папки drawable, drawable-anydpi, drawable-hdpi, drawable-mdpi, drawable-v24, drawable-xhdpi, drawable-xxhdpi . Состав папок менялся в каждой версии студии, сейчас там вообще две папки drawable и drawable-v24 ;
- layout — в данной папке содержатся xml -файлы, описывающие внешний вид форм и различных элементов форм. После создания проекта там уже имеется файл activity_main.xml , который отвечает за внешний вид главного окна приложения.
- mipmap — здесь хранят значки приложения под разные разрешения экрана. В реальности это папки mipmap-anydpi-v26, mipmap-hdpi, mipmap-mdpi, mipmap-xhdpi, mipmap-xxhdpi, mipmap-xxxhdpi ;
- values — тут размещаются строковые ресурсы, ресурсы цветов, тем, стилей и измерений, которые мы можем использовать в нашем проекте. Здесь вы можете видеть файлы colors.xml, strings.xml, styles.xml . В старых проектах был ещё файл dimens.xml, сейчас от него отказались
На следующем шаге мы рассмотрим определение UI .
Как выбираются ресурсы из папок xhdpi, hdpi, mdpi и подобных для конкретного устройства?
В моём приложении есть фон и картинка на нём. По умолчанию у меня в AS есть только папка drawable. Создал xxhdpi, xhdpi, hdpi, mdpi в директории res, раскидал по ним уменьшенные копии картинки и фона. Я так понял, приложение само должно брать картинку из определённой директории в зависимости от разрешения экрана. Но я не понимаю даже, как и к какой картинке обращаться в коде. Помогите, пожалуйста, разобраться.
Отслеживать
36.8k 6 6 золотых знаков 48 48 серебряных знаков 125 125 бронзовых знаков
задан 16 янв 2016 в 0:34
Господь Бомж Господь Бомж
69 5 5 бронзовых знаков
У всех копий разного размера должно быть одинаковое имя. Обращаетесь вы по id, сгенерипованому R-классом для этого имени, система сама выберет, исходя из текущей конфигурации системы, наиболее подходящий размер.
16 янв 2016 в 1:48
Метки (теги) нужны для того, чтобы выделить основные моменты ВОПРОСА, по которым другие пользователи быстрее смогут найти решение аналогичной проблемы, а не для демонстрации собственных предпочтений в выборе IDE. Вопрос никак не связан с проблемами при работе IDE Android Studio и этот тег в вопросе не нужен
16 янв 2016 в 3:27
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Для начала вам необходимо ознакомиться с официальным руководством по поддержке устройств с разными размерами экранов. Там предельно подробно объясняется ВСЕ по этой теме.
Для того, чтобы система использовала определенное изображение для какой-то плотности экрана есть два способа:
-
Ручной.
Вам необходимо создать в директории /res проекта папки /drawable с квалификаторами нужной плотности, например для разрешения HDPI, указать соответственно квалификатор -hdpi: /res/drawable-hdpi (полный список возможных квалификаторов указан в таблице). В эту папку поместить изображение для указанной плотности с ТАКИМ ЖЕ ИМЕНЕМ файла, структура папок примет следующий вид:
res/drawable/ image1.png res/drawable-hdpi/ image1.png res/drawable-xhdpi/ image1.png
При запуске программы на конкретном устройстве, система определит, какая плотность пикселей у этого устройства и будет использовать изображение из папки с соответствующим квалификатором. При отсутствии подходящего квалификатора будет выбран ресурс с наиболее близко подходящим значением плотности или из папки /res/drawable/, если ничего более лучшего не найдется (никакие квалификаторы плотности не указаны).
При сборке проекта IDE сгенерирует файл ресурсов R, в котором будут указаны ссылки на все ресурсы проекта. Обращаться к вашему изображению из кода следует следующим образом:
R.drawable.image1
Система сама подберет наиболее подходящий вариант для текущего устройства.
- Автоматический.
В IDE Android Studio имеется инструмент для автоматической подготовки изображений под разные плотности экрана.
Кликаете на папке res/ проекта и следуете: New -> Image Asset. Откроется инструмент Asset Studio, в котором вам необходимо:
- выбрать тип подготавливаемого изображения (иконка для приложения, экшенбара или нотификации).
- указать файл изображения, из которого следует подготовить набор под нужные плотности (чекбокс Image), либо выбрать из дефолтных изображений (чекбокс Clipart)
- Указать имя, которое получит ресурс в проекте.
- Так же вы можете задать паддинги, обрезку и форму подложки (квадрат, круг и тд.)

Нажав кнопку Next мастера, вы перейдете на следующий экран, где необходимо выбрать, какие создавать папки для отдельных плотностей — выделяйте нужные вам папки с помощью левого клика с зажатой кнопкой Ctrl (Shift).
Нажав кнопку Finish мастера будут автоматически подготовлены изображения для указанных плотностей, создана необходимая структура папок и в них размещены соответствующие изображения.
Недостаток этого инструмента в том, что нельзя так обработать произвольное изображение. Работает только для указанных типов иконок и создает файлы только соответствующего этим иконкам размера, например для иконки приложения под плотность HDPI будет создано изображение, размером 72х72 пикселей.
Так же смотрите эти ответы по смежным вопросам: ответ1 и ответ2
Основы
Существует огромное количество устройств с разными размерами экрана от 2.6 до 6 дюймов (для телефонов) с разрешениями от 240х320 до 1440х2560 пикселей с плотностью от ldpi до xxxhdpi. И дизайнеру нужно уметь создать правильный макет для зоопарка устройств.
На данный момент Android поддерживает следующие параметры: ldpi, mdpi, hdpi, xhdpi, xxhdpi and xxxhdpi.
Базовой является плотность mdpi, когда 1px = 1dp. Остальные являются множителями:
- ldpi (0.75x)
- mdpi (1x)
- hdpi (1.5x)
- xhdpi (2.0x)
- xxhdpi (3.0x)
- xxxhdpi (4.0x)
Как уже я сказал, MDPI является базовой точкой отсчёта и соответствует размеру экрана 320х480 пикселей. Для HDPI — 480×720, XHDPI — 640×960.
Размер устройства в DP вычисляется по формуле: разрешение экрана делим на множитель, указанный выше.
Например, устройство с разрешением экрана 240х320px соответствуют 320х426.66dp (240 / 0.75 = 320; 320 / 0.75 = 426.66).
Соответственно, устройство с экраном 1080х1920 (Samsung S5) соответствует типу XXHDPI — 360x640dp (1080 / 3 = 360; 1920 / 3 = 640dp)
Дизайнер должен подготовить ресурсы для всех основных типов экрана и разместить их в соответствующих папках, а система сама выберет нужный ресурс из нужной папки.
Что будет, если подготовить одну картинку? Есть два варианта. Допустим, вы приготовили картинку для базового размера во весь экран. На современных телефонах картинка растянется в 3-4 раза и будет размыта. Хорошо, пойдём от обратного и подготовим картинку для самого большого экрана. Тут нас может ожидать другая неприятность — нехватка памяти. Большая картинка может занимать размер от 2Мб и выше. Маленькие экраны физически не смогут показать такое изображение, но будут при этом потреблять в 3-4 раза больше памяти, которой может не хватить для приложения.
Также следует учитывать, что размеры экрана у разных устройств увеличиваются/уменьшаются непропорционально по ширине и высоте. Поэтому дизайн экрана приложения должен быть достаточно гибким.
Обычно создаётся дизайн сверху вниз. Вначале наибольший размер, который будет поддерживаться приложением, а потом постепенно уменьшают все ресурсы для других разрешений.
Для фона экрана приложения используются следующие типы ресурсов:
- Color
- Gradient
- 9-patch Drawable
- Повторяющие фрагменты
- Картинка на весь экран
Выше объяснялось, почему не стоит использовать последний вариант. Если ли приходится работать с этим вариантом, то используйте следующую технику. Допустим, дизайнером была подготовлена очень большая картинка на весь экран в альбомном режиме. На телефоне можно применить кадрирование и показать только центральную часть.


У компонента ImageView есть атрибут scaleType с значением CENTER_CROP.
Также можно поместить изображение в центр и добавить цветную или градиентную рамку вокруг него.

Используйте в этом случае scaleType = CENTER_INSIDE.
Если фон однородный и его можно растянуть без ущерба качеству, то воспользуйтесь scaleType = FIT_XY.
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-файлов, которые ведут себя достаточно независимо то разрешения экранов при правильном использовании.
Дополнительное чтение
О градиентах в отдельной статье