Vector Drawable este un format de grafică vectorială pentru Android bazat pe XML, care permite crearea de imagini scalabile fără pierdere de calitate. Spre deosebire de PNG și JPEG, vectorul stochează contururile geometrice și umpluturile sub formă de instrucțiuni text, ceea ce oferă o dimensiune minimă a fișierului și adaptare la orice densitate a ecranului. Conform documentației Android Developers (2026), Vector Drawable reduce dimensiunea APK în medie cu 40–60% comparativ cu setul de resurse raster pentru diferite rezoluții.
Puncte principale
Vector Drawable este o resursă Android ce reprezintă o imagine vectorială în format XML, bazată pe specificația SVG (Scalable Vector Graphics). Google a introdus acest format în Android 5.0 (API 21) ca alternativă la imaginile raster pentru pictograme, ilustrații și alte elemente grafice ale interfeței.
Spre deosebire de PNG, unde imaginea este stocată ca o matrice de pixeli de dimensiune fixă, Vector Drawable descrie formele matematic — prin coordonatele punctelor, curbe Bezier, umpluturi și contururi. Aceasta înseamnă că o singură imagine vectorială poate înlocui până la șase fișiere PNG pentru diferite densități ale ecranului (mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi, nodpi), ceea ce simplifică radical întreținerea resurselor grafice.
Formatul suportă nu doar imagini statice, ci și animație prin AnimatedVectorDrawable, precum și adaptarea la tema întunecată și culori personalizate prin atributele temei. Începând cu Android 7.0 (API 24), Vector Drawable suportă și umpluturi gradient și operații complexe de decupare (clipPath), ceea ce extinde posibilitățile de design.
Fiecare Vector Drawable conține elementul rădăcină vector cu parametrii de lățime, înălțime și viewport — un sistem de coordonate virtual în care sunt desenate formele. În interior se află grupuri (group) și căi (path), unde path definește geometria printr-o secvență de comenzi: M (moveTo), L (lineTo), C (cubicTo), Z (close) și altele. Fiecare path poate avea propria umplutură (fillColor) și contur (strokeColor), care pot face referire la resursele temei.
Elemente suplimentare includ clip-path pentru decupare, gradient pentru tranziții gradient și atribute de adaptare la tema întunecată prin atributul android:theme. Toate culorile din Vector Drawable pot fi definite ca referințe la atributele temei (de exemplu, ?attr/colorPrimary), ceea ce modifică aspectul pictogramelor la schimbarea temei fără duplicarea resurselor.
Fișierul XML Vector Drawable se plasează în directorul res/drawable/ și are elementul rădăcină <vector>. În interior pot fi <group> imbricate pentru organizarea ierarhiei și <path> pentru descrierea contururilor. Fiecare path conține atributul pathData — un șir de comenzi de desenare în formatul căii 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>
În exemplu este descris un cerc cu raza de 10 unități în viewport 24×24. Parametrul fillColor face referire la o resursă de culoare, iar strokeWidth și strokeColor definesc conturul. Dimensiunile width și height se indică în dp — aceasta asigură scalarea corectă pe ecrane cu densitate diferită de pixeli fără transformări suplimentare.
Elementul group permite gruparea mai multor path-uri și aplicarea de transformări comune: rotație (rotation), deplasare (translateX, translateY) și scalare (scaleX, scaleY). Grupurile pot fi imbricate, ceea ce permite crearea unei ierarhii complexe din sute de elemente fără pierdere de performanță.
<vector ...>
<group android:name="arrow_group"
android:pivotX="12"
android:pivotY="12"
android:rotation="90">
<path .../>
</group>
</vector>
Gruparea cu atributul pivotX/pivotY este utilizată pentru animație: se poate roti sau scala o parte a imaginii independent de celelalte elemente, ceea ce este deosebit de util pentru crearea pictogramelor de stare animate (de exemplu, încărcare → succes).
Alegerea între grafica vectorială și cea raster depinde de scenariul de utilizare. Vector Drawable este ideal pentru pictograme, ilustrații și elemente de interfață cu puține detalii, în timp ce fotografiile și imaginile complexe cu mii de culori rămân în formate raster.
| Parametru | Vector Drawable | PNG |
|---|---|---|
| Scalare | Fără pierdere de calitate | Pierdere la mărire |
| Dimensiune fișier | 0.5–5 KB | 10–100 KB pe rezoluție |
| Număr fișiere | 1 XML | 6 PNG (mdpi–xxxhdpi) |
| Animație | Suportată | Doar schimbare cadre |
| Adaptare temă | Prin ?attr | Seturi separate |
| Scene complexe | Limitat | Oricare |
Conform Android Performance Patterns (Google I/O 2016), înlocuirea pictogramelor PNG cu Vector Drawable reduce dimensiunea APK cu 40–60% pentru aplicațiile cu multe resurse grafice. Totuși, la randarea vectorilor complecși cu sute de path-uri, încărcarea CPU crește, de aceea pentru animații și redesenări frecvente se recomandă utilizarea rasterelor stocate în cache.
Vector Drawable este optim pentru pictograme de interfață (bara de instrumente, navigare, stări), logo-uri, ilustrații simple și elemente animate. Formatul este deosebit de avantajos la suportarea mai multor ecrane: în loc să generați PNG pentru șase densități, un singur fișier XML este suficient. Aceasta simplifică întreținerea designului și elimină erorile de nepotrivire a dimensiunilor. Pentru fotografii și imagini cu gradiente fotorealiste se utilizează în continuare formate raster cu compresie WebP.
Android suportă animația Vector Drawable prin două mecanisme: AnimatedVectorDrawable (disponibil de la API 21) și AnimatedStateListDrawable. Primul permite animarea atributelor path — rotație, deplasare, schimbare de culoare și formă. Al doilea comută între diferite stări (apăsare, selectare) cu tranziție lină.
AnimatedVectorDrawable utilizează trei fișiere XML: Vector Drawable propriu-zis, ObjectAnimator cu descrierea animației și AnimatedVectorDrawable de legătură care conectează target (numele grupului sau căii) cu animatorul. Animația poate modifica fillColor, strokeColor, rotation, translateX/Y, scaleX/Y și chiar pathData — adică poate transforma lin o formă în alta (morphing).
Să considerăm o animație în care pictograma „plus” se transformă în „cruce”. Limitarea principală: numărul de comenzi pathData trebuie să coincidă în starea inițială și finală, altfel animația nu va funcționa.
<!-- res/drawable/anim_plus_to_close.xml -->
<animated-vector xmlns:android="...">
<target
android:name="plus_path"
android:animation="@anim/plus_to_close"/>
</animated-vector>
Animația ObjectAnimator plus_to_close modifică proprietatea pathData de la forma inițială „plus” la forma „cruce” în 300 de milisecunde. Sistemul interpolează automat coordonatele între cele două seturi de comenzi ale căilor SVG. O astfel de animație este utilizată pe scară largă în Material Design pentru tranziții line ale stărilor butoanelor și pictogramelor.
Să analizăm un exemplu complet de vector XML pentru pictograma săgeată înapoi cu suport pentru tema întunecată. Culoarea este definită prin referință la un atribut al temei, ceea ce schimbă automat culoarea pictogramei la comutarea între tema deschisă și cea întunecată fără duplicarea resurselor.
<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>
Parametrul android:tint cu valoarea ?attr/colorControlNormal aplică automat culoarea sistemică a elementului de control — pe tema deschisă este gri închis, pe cea întunecată — alb. Grupul numit arrow permite animarea acestei pictograme prin AnimatedVectorDrawable.
Pentru încărcarea programatică a Vector Drawable în Android se utilizează clasa AppCompatResources.getDrawable() sau metoda ContextCompat.getDrawable(). În proiectele moderne pe Jetpack Compose, Drawable-urile raster și vectoriale se încași prin painterResource, care detectează automat formatul resursei.
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
)
La utilizarea AppCompatResources.getDrawable(), biblioteca AppCompat selectează singură versiunea corectă de drawable în funcție de nivelul API: pe dispozitivele mai vechi de Android 5.0 (API 21) poate fi utilizată o versiune raster de rezervă (fallback), pe cele mai noi — Vector Drawable. În Jetpack Compose, painterResource gestionează această compatibilitate automat.
Întrebări frecvente
Vector Drawable este suportat nativ de la Android 5.0 (API 21). Pentru versiunile mai vechi este necesară utilizarea bibliotecii AppCompat (resursele vectoriale funcționează prin ea pe dispozitive cu API 7+). De asemenea, este necesară flag-ul vectorDrawables.useSupportLibrary = true în build.gradle.
Da, Jetpack Compose suportă Vector Drawable prin funcția painterResource(). Componenta Icon încarcă automat resursa vectorială din res/drawable/ și aplică tema Material pentru tint. Vectorii se întind fără pierdere de calitate la orice dimensiuni specificate prin parametrul modifier.
SVG este un standard web universal cu un set bogat de capacități (filtre, măști, stiluri încorporate). Vector Drawable este o versiune adaptată pentru Android cu un subset limitat de comenzi SVG. Android nu suportă SVG direct, ci doar Vector Drawable generat din SVG prin Android Studio Asset Studio.
Cea mai simplă metodă este utilizarea Android Studio: clic dreapta pe folderul drawable → New → Vector Asset → Import local SVG file. Studio optimizează automat SVG și generează XML Vector Drawable. O altă opțiune sunt convertoarele online, precum SVG2VectorDrawable sau ShapeShifter, care suportă exportul cu animație.
Problema este de obicei legată de lipsa suportului AppCompat. Asigurați-vă că în build.gradle este setată flag-ul vectorDrawables.useSupportLibrary = true și se utilizează AppCompatDelegate. De asemenea, verificați dacă Vector Drawable nu conține capacități indisponibile în versiunea utilizată a bibliotecii AppCompat.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și