Vector Drawable — format grafiki wektorowej dla Androida oparty na XML, umożliwiający tworzenie skalowalnych obrazów bez utraty jakości. W przeciwieństwie do PNG i JPEG, wektor przechowuje geometryczne kontury i wypełnienia w postaci instrukcji tekstowych, co zapewnia minimalny rozmiar pliku i adaptację do dowolnej gęstości ekranu. Według dokumentacji Android Developers (2026), Vector Drawable zmniejsza rozmiar APK średnio o 40–60% w porównaniu z zestawem zasobów rastrowych dla różnych rozdzielczości.
Najważniejsze
Vector Drawable to zasób Androida przedstawiający obraz wektorowy w formacie XML, oparty na specyfikacji SVG (Scalable Vector Graphics). Google wprowadziła ten format w Android 5.0 (API 21) jako alternatywę dla obrazów rastrowych dla ikon, ilustracji i innych elementów graficznych interfejsu.
W przeciwieństwie do PNG, gdzie obraz przechowywany jest jako tablica pikseli o stałym rozmiarze, Vector Drawable opisuje kształty matematycznie — poprzez współrzędne punktów, krzywe Beziera, wypełnienia i obrysy. Oznacza to, że jeden obraz wektorowy może zastąpić do sześciu plików PNG dla różnych gęstości ekranu (mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi, nodpi), co radykalnie upraszcza utrzymanie zasobów graficznych.
Format obsługuje nie tylko statyczne obrazy, ale także animację przez AnimatedVectorDrawable, a także adaptację do ciemnego motywu i niestandardowe kolory poprzez atrybuty motywu. Od Androida 7.0 (API 24) Vector Drawable obsługuje również wypełnienia gradientowe i złożone operacje przycinania (clipPath), co rozszerza możliwości projektowania.
Każdy Vector Drawable zawiera główny element vector z parametrami szerokości, wysokości i viewport — wirtualnego układu współrzędnych, w którym rysowane są kształty. Wewnątrz znajdują się grupy (group) i ścieżki (path), gdzie path definiuje geometrię poprzez sekwencję komend: M (moveTo), L (lineTo), C (cubicTo), Z (close) i innych. Każdy path może mieć własne wypełnienie (fillColor) i obrys (strokeColor), które mogą odwoływać się do zasobów motywu.
Dodatkowe elementy obejmują clip-path do przycinania, gradient do przejść gradientowych oraz atrybuty adaptacji do ciemnego motywu poprzez atrybut android:theme. Wszystkie kolory w Vector Drawable mogą być określone jako odniesienia do atrybutów motywu (np. ?attr/colorPrimary), co zmienia wygląd ikon przy zmianie motywu bez duplikowania zasobów.
Plik XML Vector Drawable umieszcza się w katalogu res/drawable/ i ma główny element <vector>. Wewnątrz mogą znajdować się zagnieżdżone <group> do organizacji hierarchii i <path> do opisu konturów. Każdy path zawiera atrybut pathData — ciąg komend rysowania w formacie ścieżki SVG.
<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>
W przykładzie opisano okrąg o promieniu 10 jednostek w viewport 24×24. Parametr fillColor odwołuje się do zasobu koloru, a strokeWidth i strokeColor określają obrys. Rozmiary width i height podaje się w dp — zapewnia to prawidłowe skalowanie na ekranach z różną gęstością pikseli bez dodatkowych przekształceń.
Element group pozwala grupować wiele ścieżek path i stosować do nich wspólne transformacje: obrót (rotation), przesunięcie (translateX, translateY) i skalowanie (scaleX, scaleY). Grupy mogą być zagnieżdżone, co umożliwia tworzenie złożonej hierarchii z setek elementów bez utraty wydajności.
<vector ...>
<group android:name="arrow_group"
android:pivotX="12"
android:pivotY="12"
android:rotation="90">
<path .../>
</group>
</vector>
Grupowanie z atrybutem pivotX/pivotY jest używane do animacji: można obracać lub skalować część obrazu niezależnie od pozostałych elementów, co jest szczególnie przydatne do tworzenia animowanych ikon stanu (np. ładowanie → sukces).
Wybór między grafiką wektorową a rastrową zależy od scenariusza użycia. Vector Drawable jest idealny dla ikon, ilustracji i elementów interfejsu z niewielką liczbą szczegółów, podczas gdy zdjęcia i złożone obrazy z tysiącami kolorów pozostają w formatach rastrowych.
| Parametr | Vector Drawable | PNG |
|---|---|---|
| Skalowanie | Bez utraty jakości | Utrata przy powiększeniu |
| Rozmiar pliku | 0.5–5 KB | 10–100 KB na rozdzielczość |
| Liczba plików | 1 XML | 6 PNG (mdpi–xxxhdpi) |
| Animacja | Obsługiwana | Tylko zmiana klatek |
| Adaptacja motywu | Przez ?attr | Osobne zestawy |
| Złożone sceny | Ograniczone | Dowolne |
Według Android Performance Patterns (Google I/O 2016), zastąpienie ikon PNG na Vector Drawable zmniejsza rozmiar APK o 40–60% dla aplikacji z dużą liczbą zasobów graficznych. Jednak przy renderowaniu złożonych wektorów z setkami ścieżek path obciążenie CPU wzrasta, dlatego do animacji i częstego przerysowywania zaleca się używanie wstępnie buforowanych rasterów.
Vector Drawable jest optymalny dla ikon interfejsu (pasek narzędzi, nawigacja, statusy), logo, prostych ilustracji i animowanych elementów. Format jest szczególnie korzystny przy obsłudze wielu ekranów: zamiast generować PNG dla sześciu gęstości wystarczy jeden plik XML. Upraszcza to utrzymanie projektu i eliminuje błędy niezgodności rozmiarów. Do zdjęć i obrazów z fotorealistycznymi gradientami wciąż używa się formatów rastrowych z kompresją WebP.
Android obsługuje animację Vector Drawable poprzez dwa mechanizmy: AnimatedVectorDrawable (dostępny od API 21) i AnimatedStateListDrawable. Pierwszy pozwala animować atrybuty path — obrót, przesunięcie, zmianę koloru i kształtu. Drugi przełącza między różnymi stanami (naciśnięcie, zaznaczenie) z płynnym przejściem.
AnimatedVectorDrawable używa trzech plików XML: samego Vector Drawable, ObjectAnimator z opisem animacji oraz łączącego AnimatedVectorDrawable, który łączy target (nazwę grupy lub ścieżki) z animatorem. Animacja może zmieniać fillColor, strokeColor, rotation, translateX/Y, scaleX/Y, a nawet pathData — czyli płynnie przekształcać jeden kształt w inny (morphing).
Rozważmy animację, w której ikona «plus» zamienia się w «krzyżyk». Główne ograniczenie: liczba komend pathData musi być zgodna w stanie początkowym i końcowym, w przeciwnym razie animacja nie zadziała.
<!-- res/drawable/anim_plus_to_close.xml -->
<animated-vector xmlns:android="...">
<target
android:name="plus_path"
android:animation="@anim/plus_to_close"/>
</animated-vector>
Animacja ObjectAnimator plus_to_close zmienia właściwość pathData od początkowej formy «plus» do formy «krzyżyk» w ciągu 300 milisekund. System automatycznie interpoluje współrzędne między dwoma zestawami komend ścieżek SVG. Taka animacja jest szeroko stosowana w Material Design do płynnych przejść stanów przycisków i ikon.
Rozważmy pełny przykład wektora XML dla ikony strzałki wstecz z obsługą ciemnego motywu. Kolor jest określany przez odniesienie do atrybutu motywu, co automatycznie zmienia kolor ikony przy przełączaniu między jasnym a ciemnym motywem bez duplikowania zasobów.
<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>
Parametr android:tint z wartością ?attr/colorControlNormal automatycznie stosuje systemowy kolor elementu sterowania — w jasnym motywie jest to ciemnoszary, w ciemnym — biały. Grupa o nazwie arrow pozwala animować tę ikonę przez AnimatedVectorDrawable.
Do programowego ładowania Vector Drawable w Androidzie używa się klasy AppCompatResources.getDrawable() lub metody ContextCompat.getDrawable(). W nowoczesnych projektach na Jetpack Compose obrazy rastrowe i wektorowe Drawable ładuje się przez painterResource, który automatycznie określa format zasobu.
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
)
Przy użyciu AppCompatResources.getDrawable() biblioteka AppCompat sama dobiera odpowiednią wersję drawable w zależności od poziomu API: na urządzeniach starszych niż Android 5.0 (API 21) może być użyta zastępcza wersja rastrowa (fallback), na nowszych — Vector Drawable. W Jetpack Compose painterResource obsługuje tę kompatybilność automatycznie.
Często zadawane pytania
Vector Drawable jest obsługiwany natywnie od Android 5.0 (API 21). Dla starszych wersji należy użyć biblioteki AppCompat (zasoby wektorowe działają przez nią na urządzeniach z API 7+). Wymagany jest również flag vectorDrawables.useSupportLibrary = true w build.gradle.
Tak, Jetpack Compose obsługuje Vector Drawable poprzez funkcję painterResource(). Komponent Icon automatycznie ładuje zasób wektorowy z res/drawable/ i stosuje motyw Material dla tint. Wektory rozciągają się bez utraty jakości do dowolnych rozmiarów określonych przez parametr modifier.
SVG to uniwersalny standard internetowy z bogatym zestawem możliwości (filtry, maski, wbudowane style). Vector Drawable to zaadaptowana dla Androida wersja z ograniczonym podzbiorem komend SVG. Android nie obsługuje SVG bezpośrednio, tylko Vector Drawable, wygenerowany z SVG przez Android Studio Asset Studio.
Najprostszy sposób to użyć Android Studio: kliknij prawym przyciskiem na folderze drawable → New → Vector Asset → Import local SVG file. Studio automatycznie optymalizuje SVG i generuje XML Vector Drawable. Inna opcja to konwertery online, np. SVG2VectorDrawable lub ShapeShifter, który obsługuje eksport z animacją.
Problem zwykle związany jest z brakiem obsługi AppCompat. Upewnij się, że w build.gradle ustawiono flagę vectorDrawables.useSupportLibrary = true i używany jest AppCompatDelegate. Sprawdź również, czy Vector Drawable nie zawiera funkcji niedostępnych w używanej wersji biblioteki AppCompat.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również