Прорисовываемые ресурсы

Прорисовываемый ресурс – это общее понятие для графического элемента, который можно нарисовать на экране и получить с помощью API, например getDrawable(int), или применить к другому ресурсу XML с помощью таких атрибутов, как android:drawable и android:icon. Существует несколько типов графических объектов:

Битовая карта
Растровый графический файл (PNG, WEBP, JPG или GIF). Создает BitmapDrawable.
Файл 9-patch
Файл PNG с растягиваемыми областями, позволяющими изменять размер изображений в зависимости от контента (.9.png). Создает NinePatchDrawable.
Список слоев
Объект Drawable, который управляет массивом других объектов Drawable. Они рисуются в порядке массива, поэтому элемент с наибольшим индексом рисуется сверху. Создает LayerDrawable.
Список штатов
XML-файл, который ссылается на разные растровые изображения для разных состояний, например для использования другого изображения при нажатии кнопки. Создает StateListDrawable.
Список уровней
XML-файл, который определяет графический объект, управляющий несколькими альтернативными графическими объектами, каждому из которых присвоено максимальное числовое значение. Создает LevelListDrawable.
Transition drawable
XML-файл, определяющий прорисовываемый ресурс, который может плавно переходить в другой прорисовываемый ресурс. Создает TransitionDrawable.
Внутренний графический объект
XML-файл, который определяет графический объект, вставляющий другой графический объект на указанное расстояние. Это полезно, когда для представления требуется фоновый графический объект, который меньше фактических границ представления.
Обрезка графического объекта
XML-файл, определяющий графический объект, который обрезает другой графический объект на основе текущего значения уровня этого объекта. Создает ClipDrawable.
Масштабируемый графический объект
XML-файл, определяющий графический объект, который изменяет размер другого графического объекта на основе его текущего значения уровня. Создает ScaleDrawable
Графический объект Shape.
XML-файл, определяющий геометрическую фигуру, включая цвета и градиенты. Создает GradientDrawable.

Информацию о том, как создать AnimationDrawable, можно найти в документе Ресурсы анимации.

Примечание. Ресурс цвета также можно использовать в качестве графического объекта в XML. Например, при создании объекта Drawable со списком состояний вы можете указать ресурс цвета для атрибута android:drawable (android:drawable="@color/green").

Битовая карта

Растровое изображение. Android поддерживает файлы растровых изображений в следующих форматах: PNG (предпочтительно), WEBP (предпочтительно, требуется API уровня 17 или выше), JPG (допустимо), GIF (не рекомендуется).

Вы можете ссылаться на файл битового изображения напрямую, используя название файла в качестве идентификатора ресурса, или создать псевдоним идентификатора ресурса в XML.

Примечание. Растровые файлы могут быть автоматически оптимизированы с помощью сжатия изображений без потерь инструментом aapt в процессе сборки. Например, полноцветный PNG, в котором используется не более 256 цветов, можно преобразовать в 8-битный PNG с палитрой. В результате получается изображение того же качества, но меньшего размера.

Поэтому имейте в виду, что двоичные файлы изображений, помещенные в этот каталог, могут измениться во время сборки. Если вы планируете считывать изображение как поток битов, чтобы преобразовать его в битовую карту, поместите изображения в папку res/raw/, где они не оптимизируются.

Растровый файл

Битовая карта – это файл PNG, WEBP, JPG или GIF. Android создает ресурс Drawable для любого из этих файлов, когда вы сохраняете их в каталоге res/drawable/.

местоположение файла;
res/drawable/filename.png (.png, .webp, .jpg или .gif)
Название файла – это идентификатор ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на BitmapDrawable
ссылка на ресурс:
В Java: R.drawable.filename
В XML: @[package:]drawable/filename
пример:
Если изображение сохранено в папке res/drawable/myimage.png, этот XML-код макета применяет изображение к представлению:
<ImageView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/myimage" />

Следующий код приложения извлекает изображение в виде Drawable:

Kotlin

val drawable: Drawable? = ResourcesCompat.getDrawable(resources, R.drawable.myimage, null)

Java

Resources res = getResources();
Drawable drawable = ResourcesCompat.getDrawable(res, R.drawable.myimage, null);
См. также:

XML-файл растрового изображения

XML-файл растрового изображения – это ресурс, определенный в XML, который указывает на растровый файл. Эффект – это псевдоним для необработанного растрового файла. В XML-файле можно указать дополнительные свойства растрового изображения, например размытие и мозаику.

Примечание. Элемент <bitmap> можно использовать как дочерний элемент <item>. Например, при создании списка состояний или списка слоев можно исключить атрибут android:drawable из элемента <item> и вложить в него элемент <bitmap>, определяющий графический объект.

местоположение файла;
res/drawable/filename.xml
Название файла – это идентификатор ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на BitmapDrawable
ссылка на ресурс:
В Java: R.drawable.filename
В XML: @[package:]drawable/filename
Синтаксис:
<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@[package:]drawable/drawable_resource"
    android:antialias=["true" | "false"]
    android:dither=["true" | "false"]
    android:filter=["true" | "false"]
    android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                      "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                      "center" | "fill" | "clip_vertical" | "clip_horizontal"]
    android:mipMap=["true" | "false"]
    android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
elements:
<bitmap>
Обязательный атрибут. Определяет источник растрового изображения и его свойства.

Атрибуты:

xmlns:android
Строка. Определяет пространство имен XML. Должно иметь значение "http://schemas.android.com/apk/res/android". Это свойство обязательно, только если <bitmap> является корневым элементом. Оно не требуется, если свойство <bitmap> вложено в свойство <item>.
android:src
Прорисовываемый ресурс. Обязательный параметр. Ссылка на прорисовываемый ресурс.
android:antialias
Логическое значение. Включает или отключает сглаживание.
android:dither
Логическое значение. Включает или отключает размытие битового изображения, если его пиксельная конфигурация не совпадает с конфигурацией экрана (например, битовое изображение ARGB 8888 на экране RGB 565).
android:filter
Логическое значение. Включает или отключает фильтрацию растровых изображений. Фильтрация используется, когда битовая карта сжимается или растягивается, чтобы сгладить ее внешний вид.
android:gravity
Ключевое слово. Определяет гравитацию для растрового изображения. Параметр gravity указывает, где разместить графический объект в контейнере, если битовая карта меньше контейнера.

Должно быть одно или несколько из следующих постоянных значений, разделенных символом |:

ЗначениеОписание
top Поместить объект в верхнюю часть контейнера, не меняя его размер.
bottom Поместить объект в нижнюю часть контейнера, не меняя его размер.
left Поместить объект у левого края контейнера, не меняя его размер.
right Поместить объект у правого края контейнера, не меняя его размер.
center_vertical Разместить объект по центру контейнера по вертикали, не меняя его размер.
fill_vertical При необходимости увеличьте размер объекта по вертикали, чтобы он полностью заполнил контейнер.
center_horizontal Разместить объект по центру контейнера по горизонтали, не меняя его размер.
fill_horizontal При необходимости увеличьте размер объекта по горизонтали, чтобы он полностью заполнил контейнер.
center Объект размещается в центре контейнера по вертикальной и горизонтальной осям без изменения размера.
fill При необходимости увеличьте размер объекта по горизонтали и вертикали, чтобы он полностью заполнил контейнер. Это значение используется по умолчанию.
clip_vertical Дополнительный параметр, который можно настроить так, чтобы верхний и/или нижний края дочернего элемента были обрезаны по границам его контейнера. Обрезка выполняется по вертикали: при привязке к верхнему краю обрезается нижний край, при привязке к нижнему краю – верхний край, а если привязка не задана, обрезаются оба края.
clip_horizontal Дополнительный параметр, который можно задать, чтобы левый и/или правый края дочернего элемента были обрезаны по границам его контейнера. Обрезка выполняется по горизонтали: при левом выравнивании обрезается правый край, при правом – левый, а при отсутствии выравнивания – оба края.
android:mipMap
Логическое значение. Включает или отключает подсказку mipmap. Подробнее: setHasMipMap(). Значение по умолчанию – false.
android:tileMode
Ключевое слово. Определяет режим мозаики. Если включен режим мозаики, растровое изображение повторяется. Если включен режим мозаики, гравитация игнорируется.

Допустимые значения:

ЗначениеОписание
disabled Не разбивать растровое изображение на фрагменты. Это значение по умолчанию.
clamp Повторять цвет края, если шейдер выходит за исходные границы.
repeat Повторять изображение шейдера по горизонтали и вертикали.
mirror Повторять изображение шейдера по горизонтали и вертикали, чередуя зеркальные изображения, чтобы соседние изображения всегда соприкасались.
пример:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/icon"
    android:tileMode="repeat" />
См. также:

Nine-patch

NinePatch – это изображение в формате PNG, в котором можно определить растягиваемые области. Android масштабирует их, когда контент в представлении выходит за обычные границы изображения. Обычно такие изображения используются в качестве фона для представлений, у которых хотя бы один размер задан как "wrap_content".

Когда представление увеличивается, чтобы вместить контент, изображение Nine-Patch также масштабируется в соответствии с размером представления. Примером использования изображения Nine-Patch является фон, используемый стандартным виджетом Button Android, который должен растягиваться, чтобы вместить текст (или изображение) внутри кнопки.

Как и в случае с обычной битовой картой, вы можете ссылаться на файл Nine-Patch напрямую или из ресурса, определенного XML.

Подробную информацию о том, как создать файл 9-patch с растягиваемыми областями, можно найти в статье Создание масштабируемых растровых изображений (файлы 9-patch).

Файл Nine-patch

местоположение файла;
res/drawable/filename.9.png
Название файла – это идентификатор ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на NinePatchDrawable
ссылка на ресурс:
В Java: R.drawable.filename
В XML: @[package:]drawable/filename
пример:
Если изображение сохранено в папке res/drawable/myninepatch.9.png, то этот XML-код макета применяет изображение Nine-Patch к представлению:
<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/myninepatch" />
См. также:

XML-файл Nine-Patch

XML-файл Nine-Patch – это ресурс, определенный в XML, который указывает на файл Nine-Patch. В XML-файле можно указать размытие для изображения.

местоположение файла;
res/drawable/filename.xml
Название файла – это идентификатор ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на NinePatchDrawable
ссылка на ресурс:
В Java: R.drawable.filename
В XML: @[package:]drawable/filename
Синтаксис:
<?xml version="1.0" encoding="utf-8"?>
<nine-patch
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@[package:]drawable/drawable_resource"
    android:dither=["true" | "false"] />
elements:
<nine-patch>
Обязательный атрибут. Определяет источник Nine-patch и его свойства.

Атрибуты:

xmlns:android
Строка. Обязательно. Определяет пространство имен XML. Должно иметь значение "http://schemas.android.com/apk/res/android".
android:src
Прорисовываемый ресурс. Обязательный параметр. Ссылка на файл nine-patch.
android:dither
Логическое значение. Включает или отключает размытие битового изображения, если его пиксельная конфигурация не совпадает с конфигурацией экрана (например, битовое изображение ARGB 8888 на экране RGB 565).
пример:
<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/myninepatch"
    android:dither="false" />

Список слоев

LayerDrawable – это графический объект, который управляет массивом других графических объектов. Каждый объект в списке рисуется в порядке, указанном в списке. Последний объект в списке рисуется поверх остальных.

Каждый графический объект представлен элементом <item> внутри одного элемента <layer-list>.

местоположение файла;
res/drawable/filename.xml
Название файла – это идентификатор ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на LayerDrawable
ссылка на ресурс:
В Java: R.drawable.filename
В XML: @[package:]drawable/filename
Синтаксис:
<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:id="@[+][package:]id/resource_name"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension"
        android:left="dimension" />
</layer-list>
elements:
<layer-list>
Обязательный атрибут. Это должен быть корневой элемент. Содержит один или несколько элементов <item>.

Атрибуты:

xmlns:android
Строка. Обязательно. Определяет пространство имен XML. Должно иметь значение "http://schemas.android.com/apk/res/android".
<item>
Определяет графический объект, который нужно поместить в слой, в позиции, заданной его атрибутами. Должен быть дочерним элементом <layer-list>. Принимает дочерние элементы <bitmap>.

Атрибуты:

android:drawable
Прорисовываемый ресурс. Обязательный параметр. Ссылка на прорисовываемый ресурс.
android:id
Идентификатор ресурса. Уникальный идентификатор ресурса для этого графического объекта. Чтобы создать новый идентификатор ресурса для этого объекта, используйте форму "@+id/name". Знак плюса указывает на то, что это новый идентификатор. С помощью этого идентификатора можно получить и изменить объект Drawable, используя View.findViewById() или Activity.findViewById().
android:top
Параметр. Верхнее смещение в виде значения параметра или ресурса параметра.
android:right
Параметр. Смещение справа в виде значения или ресурса.
android:bottom
Параметр. Смещение снизу в виде значения или ресурса.
android:left
Параметр. Смещение слева в виде значения или ресурса.

По умолчанию все графические объекты масштабируются в соответствии с размером содержащего их представления. Таким образом, размещение изображений в списке слоев в разных позициях может увеличить размер представления, а некоторые изображения масштабируются соответствующим образом.

Чтобы избежать масштабирования элементов в списке, используйте элемент <bitmap> внутри элемента <item>, чтобы указать графический объект и определить гравитацию для чего-то, что не масштабируется, например "center". Например, следующий код <item> определяет элемент, который масштабируется в соответствии с размером контейнера:

<item android:drawable="@drawable/image" />

Чтобы избежать масштабирования, в следующем примере используется элемент <bitmap> с центрированной гравитацией:

<item>
  <bitmap android:src="@drawable/image"
          android:gravity="center" />
</item>
пример:
XML-файл сохранен в res/drawable/layers.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
      <bitmap android:src="@drawable/android_red"
        android:gravity="center" />
    </item>
    <item android:top="10dp" android:left="10dp">
      <bitmap android:src="@drawable/android_green"
        android:gravity="center" />
    </item>
    <item android:top="20dp" android:left="20dp">
      <bitmap android:src="@drawable/android_blue"
        android:gravity="center" />
    </item>
</layer-list>

В этом примере используется вложенный элемент <bitmap>, чтобы определить прорисовываемый ресурс для каждого элемента с гравитацией "center". Это гарантирует, что ни одно из изображений не будет масштабировано по размеру контейнера из-за изменения размера, вызванного смещением изображений.

Этот XML-код макета применяет объект Drawable к представлению:

<ImageView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/layers" />

В результате получается стопка изображений, смещенных относительно друг друга:

См. также:

Список штатов

StateListDrawable – это графический объект, определенный в XML, который использует несколько изображений для представления одной и той же графики в зависимости от состояния объекта. Например, виджет Button может быть нажат, выбран или неактивен. С помощью списка состояний вы можете задать разные фоновые изображения для каждого состояния.

Список состояний описывается в XML-файле. Каждое изображение представлено элементом <item> внутри одного элемента <selector>. Каждый элемент <item> использует различные атрибуты для описания состояния, в котором он используется в качестве графического объекта для отрисовки.

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

местоположение файла;
res/drawable/filename.xml
Название файла – это идентификатор ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на StateListDrawable
ссылка на ресурс:
В Java: R.drawable.filename
В XML: @[package:]drawable/filename
Синтаксис:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:constantSize=["true" | "false"]
    android:dither=["true" | "false"]
    android:variablePadding=["true" | "false"] >
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_hovered=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_activated=["true" | "false"]
        android:state_window_focused=["true" | "false"] />
</selector>
elements:
<selector>
Обязательный атрибут. Это должен быть корневой элемент. Содержит один или несколько элементов <item>.

Атрибуты:

xmlns:android
Строка. Обязательно. Определяет пространство имен XML. Должно иметь значение "http://schemas.android.com/apk/res/android".
android:constantSize
Логическое значение. True, если сообщаемый внутренний размер объекта остается постоянным при изменении состояния (размер является максимальным для всех состояний); false, если размер зависит от текущего состояния. Значение по умолчанию – false.
android:dither
Логическое значение. True, чтобы включить размытие битовой карты, если ее конфигурация пикселей не совпадает с конфигурацией экрана (например, битовая карта ARGB 8888 на экране RGB 565). False, чтобы отключить размытие. Значение по умолчанию – true.
android:variablePadding
Логическое значение. True, если отступы графического объекта меняются в зависимости от выбранного текущего состояния; false, если отступы должны оставаться неизменными на основе максимального отступа для всех состояний. Чтобы включить эту функцию, вам нужно будет выполнять макет при изменении состояния, что часто не поддерживается. Значение по умолчанию – false.
<item>
Определяет графический объект, который будет использоваться в определенных состояниях, описанных его атрибутами. Должен быть дочерним элементом <selector>.

Атрибуты:

android:drawable
Прорисовываемый ресурс. Обязательный параметр. Ссылка на прорисовываемый ресурс.
android:state_pressed
Логическое значение. True, если этот элемент используется при нажатии на объект, например кнопку. False, если этот элемент используется в состоянии по умолчанию, когда нажатия не происходит.
android:state_focused
Логическое значение. True, если этот элемент используется, когда объект находится в фокусе ввода, например когда пользователь выбирает поле ввода текста; false, если этот элемент используется в состоянии по умолчанию, не в фокусе.
android:state_hovered
Логическое значение. True, если этот элемент используется, когда курсор наведен на объект; false, если этот элемент используется в состоянии по умолчанию, когда курсор не наведен. Часто этот объект может быть тем же, что и для состояния focused.

Добавлено в API уровня 14.

android:state_selected
Логическое значение. True, если этот элемент используется, когда объект выбран пользователем при навигации с помощью кнопок направления, например при навигации по списку с помощью d-pad; false, если этот элемент используется, когда объект не выбран.

Состояние "Выбрано" используется, когда состояния android:state_focused недостаточно, например когда фокус находится на списке и элемент в нем выбран с помощью d-pad.

android:state_checkable
Логическое значение. True, если этот элемент используется, когда объект можно выбрать; false, если этот элемент используется, когда объект нельзя выбрать. Используется, только если объект может переключаться между выбираемым и невыбираемым виджетом.
android:state_checked
Логическое значение. True, если этот элемент используется, когда объект выбран; false, если он используется, когда объект не выбран.
android:state_enabled
Логическое значение. True, если этот элемент используется, когда объект включен, то есть может получать события касания или клика; false, если он используется, когда объект отключен.
android:state_activated
Логическое значение. True, если этот элемент используется, когда объект активирован как постоянный выбор, например для выделения ранее выбранного элемента списка в постоянном представлении навигации; false, если он используется, когда объект не активирован.

Появился в API уровня 11.

android:state_window_focused
Логическое значение. True, если этот элемент используется, когда окно приложения находится в фокусе, то есть приложение работает на переднем плане; false, если этот элемент используется, когда окно приложения не находится в фокусе, например, если панель уведомлений опущена или появляется диалоговое окно.

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

пример:
XML-файл сохранен в res/drawable/button.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:drawable="@drawable/button_pressed" /> <!-- pressed -->
    <item android:state_focused="true"
          android:drawable="@drawable/button_focused" /> <!-- focused -->
    <item android:state_hovered="true"
          android:drawable="@drawable/button_focused" /> <!-- hovered -->
    <item android:drawable="@drawable/button_normal" /> <!-- default -->
</selector>

Этот XML-код макета применяет список состояний к кнопке:

<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/button" />
См. также:

Список уровней

Объект Drawable, который управляет несколькими альтернативными объектами Drawable, каждому из которых присвоено максимальное числовое значение. При установке значения уровня прорисовываемого ресурса с помощью setLevel() загружается прорисовываемый ресурс из списка уровней, у которого значение android:maxLevel больше или равно значению, переданному методу.

местоположение файла;
res/drawable/filename.xml
Название файла – это идентификатор ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на LevelListDrawable
ссылка на ресурс:
В Java: R.drawable.filename
В XML: @[package:]drawable/filename
Синтаксис:
<?xml version="1.0" encoding="utf-8"?>
<level-list
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@drawable/drawable_resource"
        android:maxLevel="integer"
        android:minLevel="integer" />
</level-list>
elements:
<level-list>
Обязательный атрибут. Это должен быть корневой элемент. Содержит один или несколько элементов <item>.

Атрибуты:

xmlns:android
Строка. Обязательно. Определяет пространство имен XML, которое должно быть "http://schemas.android.com/apk/res/android".
<item>
Определяет графический объект, который будет использоваться на определенном уровне.

Атрибуты:

android:drawable
Прорисовываемый ресурс. Обязательный параметр. Ссылка на прорисовываемый ресурс, который нужно вставить.
android:maxLevel
Целое число. Максимальный уровень, разрешенный для этого предмета.
android:minLevel
Целое число. Минимальный уровень, разрешенный для этого предмета.
пример:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@drawable/status_off"
        android:maxLevel="0" />
    <item
        android:drawable="@drawable/status_on"
        android:maxLevel="1" />
</level-list>

После применения к View уровень можно изменить с помощью setLevel() или setImageLevel().

См. также:

Графический объект перехода

TransitionDrawable – это графический объект, который может плавно переходить между двумя другими графическими ресурсами.

Каждый графический объект представлен элементом <item> внутри одного элемента <transition>. Поддерживается не более двух элементов. Чтобы перейти на новую версию, позвоните по номеру startTransition(). Чтобы вернуться к предыдущему состоянию, вызовите reverseTransition().

местоположение файла;
res/drawable/filename.xml
Название файла – это идентификатор ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на TransitionDrawable
ссылка на ресурс:
В Java: R.drawable.filename
В XML: @[package:]drawable/filename
Синтаксис:
<?xml version="1.0" encoding="utf-8"?>
<transition
xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:id="@[+][package:]id/resource_name"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension"
        android:left="dimension" />
</transition>
elements:
<transition>
Обязательный атрибут. Это должен быть корневой элемент. Содержит один или несколько элементов <item>.

Атрибуты:

xmlns:android
Строка. Обязательно. Определяет пространство имен XML. Должно иметь значение "http://schemas.android.com/apk/res/android".
<item>
Определяет графический объект, который будет использоваться в качестве части перехода. Должен быть дочерним элементом <transition>. Принимает дочерние элементы <bitmap>.

Атрибуты:

android:drawable
Прорисовываемый ресурс. Обязательный параметр. Ссылка на прорисовываемый ресурс.
android:id
Идентификатор ресурса. Уникальный идентификатор ресурса для этого графического объекта. Чтобы создать новый идентификатор ресурса для этого объекта, используйте форму "@+id/name". Знак плюса указывает на то, что это новый идентификатор. С помощью этого идентификатора можно получить и изменить объект Drawable, используя View.findViewById() или Activity.findViewById().
android:top
Целое число. Смещение сверху в пикселях.
android:right
Целое число. Смещение вправо в пикселях.
android:bottom
Целое число. Нижнее смещение в пикселях.
android:left
Целое число. Смещение слева в пикселях.
пример:
XML-файл сохранен в res/drawable/transition.xml:
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/on" />
    <item android:drawable="@drawable/off" />
</transition>

Этот XML-код макета применяет объект Drawable к представлению:

<ImageButton
    android:id="@+id/button"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/transition" />

А следующий код выполняет переход от первого элемента ко второму за 500 мс:

Kotlin

val button: ImageButton = findViewById(R.id.button)
val drawable: Drawable = button.drawable
if (drawable is TransitionDrawable) {
    drawable.startTransition(500)
}

Java

ImageButton button = (ImageButton) findViewById(R.id.button);
Drawable drawable = button.getDrawable();
if (drawable instanceof TransitionDrawable) {
    ((TransitionDrawable) drawable).startTransition(500);
}
См. также:

Объект InsetDrawable

Объект Drawable, определенный в XML, который вставляет другой объект Drawable на указанное расстояние. Это полезно, когда для представления нужен фон, который меньше фактических границ представления.

местоположение файла;
res/drawable/filename.xml
Название файла – это идентификатор ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на InsetDrawable
ссылка на ресурс:
В Java: R.drawable.filename
В XML: @[package:]drawable/filename
Синтаксис:
<?xml version="1.0" encoding="utf-8"?>
<inset
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:insetTop="dimension"
    android:insetRight="dimension"
    android:insetBottom="dimension"
    android:insetLeft="dimension" />
elements:
<inset>
Обязательный атрибут. Определяет вставку. Это должен быть корневой элемент.

Атрибуты:

xmlns:android
Строка. Обязательно. Определяет пространство имен XML. Должно иметь значение "http://schemas.android.com/apk/res/android".
android:drawable
Прорисовываемый ресурс. Обязательный параметр. Ссылка на прорисовываемый ресурс, который нужно вставить.
android:insetTop
Параметр. Верхняя вставка в виде значения или ресурса.
android:insetRight
Параметр. Правый отступ в виде значения или ресурса.
android:insetBottom
Параметр. Нижний отступ в виде значения или ресурса.
android:insetLeft
Параметр. Левая вставка в виде значения или ресурса.
пример:
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/background"
    android:insetTop="10dp"
    android:insetLeft="10dp" />
См. также:

Объект ClipDrawable

Графический объект, определенный в XML, который обрезает другой графический объект на основе текущего уровня этого объекта. Вы можете контролировать, насколько дочерний объект обрезается по ширине и высоте в зависимости от уровня, а также гравитацию, чтобы контролировать, где он размещается в общем контейнере. Чаще всего используется для реализации таких вещей, как индикаторы выполнения.

местоположение файла;
res/drawable/filename.xml
Название файла – это идентификатор ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на ClipDrawable
ссылка на ресурс:
В Java: R.drawable.filename
В XML: @[package:]drawable/filename
Синтаксис:
<?xml version="1.0" encoding="utf-8"?>
<clip
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:clipOrientation=["horizontal" | "vertical"]
    android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                     "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                     "center" | "fill" | "clip_vertical" | "clip_horizontal"] />
elements:
<clip>
Обязательный атрибут. Определяет графический объект для обрезки. Это должен быть корневой элемент.

Атрибуты:

xmlns:android
Строка. Обязательно. Определяет пространство имен XML. Должно иметь значение "http://schemas.android.com/apk/res/android".
android:drawable
Прорисовываемый ресурс. Обязательный параметр. Ссылка на обрезаемый прорисовываемый ресурс.
android:clipOrientation
Ключевое слово. Ориентация клипа.

Использовать нужно одно из следующих значений:

ЗначениеОписание
horizontal Обрезать графический объект по горизонтали.
vertical Обрезать графический объект по вертикали.
android:gravity
Ключевое слово. Указывает, где нужно обрезать объект.

Должно быть одно или несколько из следующих постоянных значений, разделенных символом |:

ЗначениеОписание
top Поместить объект в верхнюю часть контейнера, не меняя его размер. Если для clipOrientation задано значение "vertical", обрезка происходит в нижней части графического объекта.
bottom Поместить объект в нижнюю часть контейнера, не меняя его размер. Если clipOrientation – "vertical", обрезка происходит в верхней части графического объекта.
left Поместить объект у левого края контейнера, не меняя его размер. Это значение используется по умолчанию. Если для атрибута clipOrientation задано значение "horizontal", обрезка выполняется с правой стороны графического объекта.
right Поместить объект у правого края контейнера, не меняя его размер. Если для атрибута clipOrientation задано значение "horizontal", обрезка выполняется по левому краю графического объекта.
center_vertical Разместить объект по центру контейнера по вертикали, не меняя его размер. Обрезка выполняется так же, как и при значении "center".
fill_vertical При необходимости увеличьте размер объекта по вертикали, чтобы он полностью заполнил контейнер. Если clipOrientation имеет значение "vertical", обрезка не выполняется, поскольку графический объект заполняет вертикальное пространство (если уровень графического объекта не равен 0, в этом случае он не виден).
center_horizontal Разместить объект по центру контейнера по горизонтали, не меняя его размер. Обрезка работает так же, как и при значении "center".
fill_horizontal При необходимости увеличьте размер объекта по горизонтали, чтобы он полностью заполнил контейнер. Если для атрибута clipOrientation задано значение "horizontal", обрезка не выполняется, поскольку графический объект заполняет горизонтальное пространство (если только уровень графического объекта не равен 0, в этом случае он не виден).
center Объект размещается в центре контейнера по вертикальной и горизонтальной осям без изменения размера. Если clipOrientation – "horizontal", обрезка происходит слева и справа. Если clipOrientation – "vertical", обрезка происходит сверху и снизу.
fill При необходимости увеличьте размер объекта по горизонтали и вертикали, чтобы он полностью заполнил контейнер. Обрезка не происходит, поскольку объект заполняет горизонтальное и вертикальное пространство (если только уровень объекта не равен 0, в этом случае он не виден).
clip_vertical Дополнительный параметр, который можно задать, чтобы верхний и/или нижний края дочернего элемента были обрезаны по границам его контейнера. Обрезка выполняется по вертикали: при привязке к верхнему краю обрезается нижний край, при привязке к нижнему краю – верхний край, а если привязка не задана, обрезаются оба края.
clip_horizontal Дополнительный параметр, который можно задать, чтобы левый и/или правый края дочернего элемента были обрезаны по границам его контейнера. Обрезка выполняется по горизонтали: при левом выравнивании обрезается правый край, при правом – левый, а при отсутствии выравнивания – оба края.
пример:
XML-файл сохранен в res/drawable/clip.xml:
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/android"
    android:clipOrientation="horizontal"
    android:gravity="left" />

Следующий XML-код макета применяет объект ClipDrawable к представлению:

<ImageView
    android:id="@+id/image"
    android:src="@drawable/clip"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" />

В следующем коде показано, как получить объект Drawable и увеличить область обрезки, чтобы постепенно показать изображение:

Kotlin

val imageview: ImageView = findViewById(R.id.image)
val drawable: Drawable = imageview.background
if (drawable is ClipDrawable) {
    drawable.level = drawable.level + 1000
}

Java

ImageView imageview = (ImageView) findViewById(R.id.image);
Drawable drawable = imageview.getBackground();
if (drawable instanceof ClipDrawable) {
    ((ClipDrawable)drawable).setLevel(drawable.getLevel() + 1000);
}

Увеличение уровня уменьшает количество отсечений и постепенно показывает изображение. Вот как это выглядит на уровне 7000:

Примечание. По умолчанию задан уровень 0, при котором изображение полностью обрезано и не видно. Если уровень равен 10 000, изображение не обрезается и видно полностью.

См. также:

Масштабируемый графический объект

Объект Drawable, определенный в XML, который изменяет размер другого объекта Drawable на основе его текущего уровня.

местоположение файла;
res/drawable/filename.xml
Название файла – это идентификатор ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на ScaleDrawable
ссылка на ресурс:
В Java: R.drawable.filename
В XML: @[package:]drawable/filename
Синтаксис:
<?xml version="1.0" encoding="utf-8"?>
<scale
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:scaleGravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                          "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                          "center" | "fill" | "clip_vertical" | "clip_horizontal"]
    android:scaleHeight="percentage"
    android:scaleWidth="percentage" />
elements:
<scale>
Обязательный атрибут. Определяет масштабируемый графический объект. Это должен быть корневой элемент.

Атрибуты:

xmlns:android
Строка. Обязательно. Определяет пространство имен XML. Должно иметь значение "http://schemas.android.com/apk/res/android".
android:drawable
Прорисовываемый ресурс. Обязательный параметр. Ссылка на прорисовываемый ресурс.
android:scaleGravity
Ключевое слово. Указывает положение центра тяжести после масштабирования.

Должно быть одно или несколько из следующих постоянных значений, разделенных символом |:

ЗначениеОписание
top Поместить объект в верхнюю часть контейнера, не меняя его размер.
bottom Поместить объект в нижнюю часть контейнера, не меняя его размер.
left Поместить объект у левого края контейнера, не меняя его размер. Это значение используется по умолчанию.
right Поместить объект у правого края контейнера, не меняя его размер.
center_vertical Разместить объект по центру контейнера по вертикали, не меняя его размер.
fill_vertical При необходимости увеличьте размер объекта по вертикали, чтобы он полностью заполнил контейнер.
center_horizontal Разместить объект по центру контейнера по горизонтали, не меняя его размер.
fill_horizontal При необходимости увеличьте размер объекта по горизонтали, чтобы он полностью заполнил контейнер.
center Объект размещается в центре контейнера по вертикальной и горизонтальной осям без изменения размера.
fill При необходимости увеличьте размер объекта по горизонтали и вертикали, чтобы он полностью заполнил контейнер.
clip_vertical Дополнительный параметр, который можно задать, чтобы верхний и/или нижний края дочернего элемента были обрезаны по границам его контейнера. Обрезка выполняется по вертикали: при привязке к верхнему краю обрезается нижний край, при привязке к нижнему краю – верхний край, а если привязка не задана, обрезаются оба края.
clip_horizontal Дополнительный параметр, который можно задать, чтобы левый и/или правый края дочернего элемента были обрезаны по границам его контейнера. Обрезка выполняется по горизонтали: при левом выравнивании обрезается правый край, при правом – левый, а при отсутствии выравнивания – оба края.
android:scaleHeight
Процент. Высота масштаба, выраженная в процентах от границы графического объекта. Значение указывается в процентах, например 100 % или 12,5 %.
android:scaleWidth
Процент. Ширина шкалы, выраженная в процентах от границы графического объекта. Значение указывается в процентах, например 100 % или 12,5 %.
пример:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/logo"
    android:scaleGravity="center_vertical|center_horizontal"
    android:scaleHeight="80%"
    android:scaleWidth="80%" />
См. также:

Графический объект Shape

Это стандартная фигура, определенная в XML.

местоположение файла;
res/drawable/filename.xml
Название файла – это идентификатор ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на GradientDrawable
ссылка на ресурс:
В Java: R.drawable.filename
В XML: @[package:]drawable/filename
Синтаксис:
<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape=["rectangle" | "oval" | "line" | "ring"] >
    <corners
        android:radius="integer"
        android:topLeftRadius="integer"
        android:topRightRadius="integer"
        android:bottomLeftRadius="integer"
        android:bottomRightRadius="integer" />
    <gradient
        android:angle="integer"
        android:centerX="float"
        android:centerY="float"
        android:centerColor="integer"
        android:endColor="color"
        android:gradientRadius="integer"
        android:startColor="color"
        android:type=["linear" | "radial" | "sweep"]
        android:useLevel=["true" | "false"] />
    <padding
        android:left="integer"
        android:top="integer"
        android:right="integer"
        android:bottom="integer" />
    <size
        android:width="integer"
        android:height="integer" />
    <solid
        android:color="color" />
    <stroke
        android:width="integer"
        android:color="color"
        android:dashWidth="integer"
        android:dashGap="integer" />
</shape>
elements:
<shape>
Обязательный атрибут. Объект ShapeDrawable. Это должен быть корневой элемент.

Атрибуты:

xmlns:android
Строка. Обязательно. Определяет пространство имен XML. Должно иметь значение "http://schemas.android.com/apk/res/android".
android:shape
Ключевое слово. Определяет тип фигуры. Допустимые значения:
ЗначениеОписание
"rectangle" Прямоугольник, заполняющий содержащее его представление. Эта форма используется по умолчанию.
"oval" Овал, соответствующий размерам содержащего его представления.
"line" Горизонтальная линия, которая занимает всю ширину содержащего ее представления. Для этой фигуры требуется элемент <stroke>, определяющий ширину линии.
"ring" Кольцо.

Следующие атрибуты используются, только если android:shape="ring":

android:innerRadius
Параметр. Радиус внутренней части кольца (отверстия в середине) в виде значения или ресурса размера.
android:innerRadiusRatio
Float. Радиус внутренней части кольца, выраженный как отношение к ширине кольца. Например, если android:innerRadiusRatio="5", то внутренний радиус равен ширине кольца, деленной на 5. Это значение переопределяется значением android:innerRadius. Значение по умолчанию – 9.
android:thickness
Параметр. Толщина кольца в виде значения размера или ресурса размера.
android:thicknessRatio
Float. Толщина кольца, выраженная как отношение к его ширине. Например, если android:thicknessRatio="2", то толщина равна ширине кольца, деленной на 2. Это значение переопределяется значением android:innerRadius. Значение по умолчанию – 3.
android:useLevel
Логическое значение. True, если используется как LevelListDrawable. Обычно используется значение false, иначе фигура может не отображаться.
<corners>
Создает закругленные углы для фигуры. Применяется, только если фигура является прямоугольником.

Атрибуты:

android:radius
Параметр. Радиус для всех углов в виде значения размера или ресурса размера. Для каждого угла это значение переопределяется следующими атрибутами.
android:topLeftRadius
Параметр. Радиус верхнего левого угла в виде значения размера или ресурса размера.
android:topRightRadius
Параметр. Радиус верхнего правого угла в виде значения или ресурса.
android:bottomLeftRadius
Параметр. Радиус левого нижнего угла в виде значения или ресурса.
android:bottomRightRadius
Параметр. Радиус для правого нижнего угла в виде значения или ресурса.

Примечание. Для каждого угла изначально должен быть задан радиус больше 1, иначе углы не будут скруглены. Если вы хотите, чтобы определенные углы не были закруглены, вы можете использовать android:radius, чтобы установить радиус угла по умолчанию больше 1, а затем переопределить каждый угол нужными значениями, указав 0 ("0dp") там, где закругленные углы не нужны.

<gradient>
Задает градиентную заливку фигуры.

Атрибуты:

android:angle
Целое число. Угол градиента в градусах. 0 – слева направо, 90 – снизу вверх. Значение должно быть кратно 45. Значение по умолчанию – 0.
android:centerX
Float. Относительное положение центра градиента по оси X (от 0 до 1,0).
android:centerY
Float. Относительное положение центра градиента по оси Y (от 0 до 1,0).
android:centerColor
Цвет. Необязательный цвет, который находится между начальным и конечным цветами. Указывается в виде шестнадцатеричного значения или ресурса цвета.
android:endColor
Цвет. Конечный цвет в виде шестнадцатеричного значения или ресурса цвета.
android:gradientRadius
Float. Радиус градиента. Применяется, только если android:type="radial".
android:startColor
Цвет. Начальный цвет в виде шестнадцатеричного значения или ресурса цвета.
android:type
Ключевое слово. Тип градиента, который нужно применить. Допустимые значения:
ЗначениеОписание
"linear" Линейный градиент. Это значение используется по умолчанию.
"radial" Радиальный градиент. Начальный цвет – это цвет в центре.
"sweep" Линейный градиент.
android:useLevel
Логическое значение. True, если это используется как LevelListDrawable.
<padding>
Поля, которые нужно применить к элементу, содержащему представление. Это позволяет изменить положение контента, а не фигуры.

Атрибуты:

android:left
Параметр. Отступ слева в виде значения или ресурса.
android:top
Параметр. Верхнее поле в виде значения или ресурса.
android:right
Параметр. Поле справа в виде значения размера или ресурса размера.
android:bottom
Параметр. Нижнее поле в виде значения размера или ресурса размера.
<size>
Размер фигуры.

Атрибуты:

android:height
Параметр. Высота фигуры в виде значения или ресурса.
android:width
Параметр. Ширина фигуры в виде значения размера или ресурса размера.

Примечание. По умолчанию фигура масштабируется до размера контейнера пропорционально заданным здесь размерам. При использовании фигуры в ImageView вы можете ограничить масштабирование, задав для android:scaleType значение "center".

<solid>
Сплошной цвет для заливки фигуры.

Атрибуты:

android:color
Цвет. Цвет, который нужно применить к фигуре, в виде шестнадцатеричного значения или ресурса цвета.
<stroke>
Контур фигуры.

Атрибуты:

android:width
Параметр. Толщина линии, заданная в виде значения или ресурса.
android:color
Цвет. Цвет линии в виде шестнадцатеричного значения или ресурса цвета.
android:dashGap
Параметр. Расстояние между штрихами в виде значения или ресурса. Действительно, только если задано значение android:dashWidth.
android:dashWidth
Параметр. Размер каждого штриха в виде значения или ресурса. Действительно, только если задано значение android:dashGap.
пример:
XML-файл сохранен в res/drawable/gradient_box.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#FFFF0000"
        android:endColor="#80FF00FF"
        android:angle="45"/>
    <padding android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
    <corners android:radius="8dp" />
</shape>

Этот XML-код макета применяет фигуру к представлению:

<TextView
    android:background="@drawable/gradient_box"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" />

Этот код приложения получает фигуру и применяет ее к представлению:

Kotlin

val shape: Drawable? = getDrawable(resources, R.drawable.gradient_box, getTheme())

val tv: TextView = findViewById(R.id.textview)
tv.background = shape

Java

Resources res = getResources();
Drawable shape = ResourcesCompat.getDrawable(res, R.drawable.gradient_box, getTheme());

TextView tv = (TextView)findViewById(R.id.textview);
tv.setBackground(shape);
См. также: