Vector Drawable: что это, формат XML и как работает

Автор: IT Sectr Опубликовано: 2026-06-12 Время чтения: 9 мин

Vector Drawable — формат векторной графики для Android, основанный на XML и позволяющий создавать масштабируемые изображения без потери качества. В отличие от PNG и JPEG, вектор хранит геометрические контуры и заливки в виде текстовых инструкций, что даёт минимальный размер файла и адаптацию под любую плотность экрана. По данным документации Android Developers (2026), Vector Drawable сокращает размер APK в среднем на 40–60% по сравнению с набором растровых ресурсов для разных разрешений.

Главное

  • Vector Drawable — формат векторной графики Android на основе XML, стандартизированный с API 21
  • Масштабирование без потери качества — вектор адаптируется под любую плотность экрана (mdpi, hdpi, xhdpi и выше)
  • Размер APK уменьшается на 40–60% за счёт замены множества PNG-файлов одним XML-файлом
  • Анимация поддерживается через AnimatedVectorDrawable и AnimatedStateListDrawable
  • Адаптация под тёмную тему реализуется атрибутом android:theme без дублирования ресурсов

Что такое Vector Drawable?

Vector Drawable — это ресурс Android, представляющий векторное изображение в формате XML, основанный на спецификации SVG (Scalable Vector Graphics). Google представила этот формат в Android 5.0 (API 21) как альтернативу растровым изображениям для иконок, иллюстраций и других графических элементов интерфейса.

В отличие от PNG, где изображение хранится как массив пикселей фиксированного размера, Vector Drawable описывает фигуры математически — через координаты точек, кривые Безье, заливки и обводки. Это означает, что одно векторное изображение может заменять до шести PNG-файлов для разных плотностей экрана (mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi, nodpi), что кардинально упрощает поддержку графических ресурсов.

Формат поддерживает не только статические изображения, но и анимацию через AnimatedVectorDrawable, а также адаптацию под тёмную тему и кастомные цвета через атрибуты темы. Начиная с Android 7.0 (API 24), Vector Drawable поддерживает также градиентные заливки и сложные операции обрезки (clipPath), что расширяет возможности дизайна.

Основные компоненты Vector Drawable

Каждый Vector Drawable содержит корневой элемент vector с параметрами ширины, высоты и viewport — виртуальной системы координат, в которой рисуются фигуры. Внутри располагаются группы (group) и пути (path), где path определяет геометрию через последовательность команд: M (moveTo), L (lineTo), C (cubicTo), Z (close) и других. Каждый path может иметь свою заливку (fillColor) и обводку (strokeColor), которые могут ссылаться на ресурсы темы.

Дополнительные элементы включают clip-path для обрезки, gradient для градиентных переходов и атрибуты адаптации под тёмную тему через атрибут android:theme. Все цвета в Vector Drawable могут быть заданы как ссылки на атрибуты темы (например, ?attr/colorPrimary), что меняет внешний вид иконок при смене темы без дублирования ресурсов.

Формат Vector Drawable: XML-структура

XML-файл Vector Drawable помещается в директорию res/drawable/ и имеет корневой элемент . Внутри могут быть вложенные для организации иерархии и для описания контуров. Каждый path содержит атрибут pathData — строку команд рисования в формате SVG-пути.

xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">

    <path
        android:fillColor="@color/ic_launcher_background"
        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2z"
        android:strokeWidth="1"
        android:strokeColor="#333333"/>

</vector>

В примере описан круг радиусом 10 единиц в viewport 24×24. Параметр fillColor ссылается на ресурс цвета, а strokeWidth и strokeColor задают обводку. Размеры width и height указываются в dp — это обеспечивает корректное масштабирование на экранах с разной плотностью пикселей без дополнительных преобразований.

Группировка и трансформации

Элемент group позволяет группировать несколько path и применять к ним общие трансформации: поворот (rotation), сдвиг (translateX, translateY) и масштабирование (scaleX, scaleY). Группы могут быть вложенными, что даёт возможность создавать сложную иерархию из сотен элементов без потери производительности.

xml
<vector ...>
    <group android:name="arrow_group"
        android:pivotX="12"
        android:pivotY="12"
        android:rotation="90">
        <path .../>
    </group>
</vector>

Группировка с атрибутом pivotX/pivotY используется для анимации: можно вращать или масштабировать часть изображения независимо от остальных элементов, что особенно полезно для создания анимированных иконок состояния (например, загрузка → успех).

Vector Drawable vs растровая графика

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

ПараметрVector DrawablePNG
МасштабированиеБез потери качестваПотеря при увеличении
Размер файла0.5–5 КБ10–100 КБ на разрешение
Количество файлов1 XML6 PNG (mdpi–xxxhdpi)
АнимацияПоддерживаетсяТолько смена кадров
Адаптация темыЧерез ?attrОтдельные наборы
Сложные сценыОграниченоЛюбые

По данным Android Performance Patterns (Google I/O 2016), замена PNG-иконок на Vector Drawable уменьшает размер APK на 40–60% для приложений с большим количеством графических ресурсов. Однако при отрисовке сложных векторов с сотнями path нагрузка на CPU возрастает, поэтому для анимаций и частых перерисовок рекомендуется использовать предварительно кэшированные растры.

Когда выбирать Vector Drawable

Vector Drawable оптимален для иконок интерфейса (тулбар, навигация, статусы), логотипов, простых иллюстраций и анимированных элементов. Формат особенно выгоден при поддержке множества экранов: вместо генерации PNG для шести плотностей достаточно одного XML-файла. Это упрощает поддержку дизайна и исключает ошибки несоответствия размеров. Для фотографий и изображений с фотореалистичными градиентами по-прежнему используются растровые форматы с компрессией WebP.

Анимация Vector Drawable

Android поддерживает анимацию Vector Drawable через два механизма: AnimatedVectorDrawable (доступен с API 21) и AnimatedStateListDrawable. Первый позволяет анимировать атрибуты path — вращение, перемещение, изменение цвета и формы. Второй переключает между разными состояниями (нажатие, выделение) с плавным переходом.

AnimatedVectorDrawable использует три XML-файла: сам Vector Drawable, ObjectAnimator с описанием анимации и связующий AnimatedVectorDrawable, который соединяет target (имя группы или пути) с animator. Анимация может менять fillColor, strokeColor, rotation, translateX/Y, scaleX/Y и даже pathData — то есть плавно трансформировать одну форму в другую (morphing).

Пример анимации морфинга

Рассмотрим анимацию, в которой иконка «плюс» превращается в «крестик». Основное ограничение: количество команд pathData должно совпадать в начальном и конечном состоянии, иначе анимация не сработает.

xml
<!-- res/drawable/anim_plus_to_close.xml -->
<animated-vector xmlns:android="...">
    <target
        android:name="plus_path"
        android:animation="@anim/plus_to_close"/>
</animated-vector>

Анимация ObjectAnimator plus_to_close изменяет свойство pathData от исходной формы «плюс» к форме «крестик» за 300 миллисекунд. Система автоматически интерполирует координаты между двумя наборами команд SVG-путей. Такая анимация широко используется в Material Design для плавных переходов состояний кнопок и иконок.

Примеры кода Vector Drawable

Рассмотрим полный пример XML-вектора для иконки стрелки назад с поддержкой тёмной темы. Цвет задаётся через ссылку на атрибут темы, что автоматически меняет цвет иконки при переключении между светлой и тёмной темами без дублирования ресурсов.

xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorControlNormal">

    <group android:name="arrow">
        <path
            android:fillColor="@android:color/white"
            android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
    </group>

</vector>

Параметр android:tint со значением ?attr/colorControlNormal автоматически применяет системный цвет элемента управления — на светлой теме это тёмно-серый, на тёмной — белый. Группа с именем arrow позволяет анимировать эту иконку через AnimatedVectorDrawable.

Загрузка Vector Drawable из кода

Для программной загрузки Vector Drawable в Android используется класс AppCompatResources.getDrawable() или метод ContextCompat.getDrawable(). В современных проектах на Jetpack Compose растровые и векторные Drawable загружаются через painterResource, который автоматически определяет формат ресурса.

kotlin
import androidx.appcompat.content.res.AppCompatResources

val vectorDrawable = AppCompatResources.getDrawable(
    context,
    R.drawable.ic_arrow_back
)

// Jetpack Compose
Icon(
    painter = painterResource(R.drawable.ic_arrow_back),
    contentDescription = "Back",
    tint = MaterialTheme.colorScheme.onSurface
)

При использовании AppCompatResources.getDrawable() библиотека AppCompat сама подбирает корректную версию drawable в зависимости от API Level: на устройствах до Android 5.0 (API 21) может использоваться растровая заглушка (fallback), на более новых — Vector Drawable. В Jetpack Compose painterResource обрабатывает эту совместимость автоматически.

Часто задаваемые вопросы

С какой версии Android поддерживается Vector Drawable?

Vector Drawable поддерживается нативно с Android 5.0 (API 21). Для более старых версий необходимо использовать библиотеку AppCompat (векторные ресурсы работают через неё на устройствах с API 7+). Также требуется флаг vectorDrawables.useSupportLibrary = true в build.gradle.

Можно ли использовать Vector Drawable в Jetpack Compose?

Да, Jetpack Compose поддерживает Vector Drawable через функцию painterResource(). Компонент Icon автоматически загружает векторный ресурс из res/drawable/ и применяет Material-тему для tint. Векторы растягиваются без потери качества до любых размеров, заданных через параметр modifier.

В чём отличие Vector Drawable от SVG?

SVG — это универсальный веб-стандарт с богатым набором возможностей (фильтры, маски, встроенные стили). Vector Drawable — адаптированная для Android версия с ограниченным подмножеством SVG-команд. Android не поддерживает SVG напрямую, только Vector Drawable, сгенерированный из SVG через Android Studio Asset Studio.

Как конвертировать SVG в Vector Drawable?

Самый простой способ — использовать Android Studio: клик правой кнопкой на папке drawable → New → Vector Asset → Import local SVG file. Студия автоматически оптимизирует SVG и генерирует XML Vector Drawable. Другой вариант — онлайн-конвертеры, например SVG2VectorDrawable или ShapeShifter, поддерживающий экспорт с анимацией.

Почему Vector Drawable не отображается на старых устройствах?

Проблема обычно связана с отсутствием поддержки AppCompat. Убедитесь, что в build.gradle установлен флаг vectorDrawables.useSupportLibrary = true и используется AppCompatDelegate. Также проверьте, что Vector Drawable не содержит возможностей, недоступных в используемой версии библиотеки AppCompat.

Итоги

  • Vector Drawable — формат векторной графики Android на основе XML, стандартизированный с API 21
  • Масштабирование без потери качества — один XML-файл заменяет шесть растровых изображений для разных плотностей
  • Размер APK сокращается на 40–60% при замене PNG-иконок на векторные аналоги
  • Анимация реализуется через AnimatedVectorDrawable с поддержкой морфинга форм и смены цвета
  • Тёмная тема поддерживается через атрибуты ?attr/colorControlNormal и android:theme
  • AppCompat обеспечивает обратную совместимость до Android 2.3 (API 7) через useSupportLibrary
  • Используйте Vector Drawable для иконок и интерфейсных элементов, PNG/WebP — для фотореалистичных изображений

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также