A Vector Drawable egy XML-alapú vektorgrafikus formátum Androidhoz, amely lehetővé teszi skálázható képek létrehozását minőségromlás nélkül. A PNG-től és JPEG-től eltérően a vektor geometriai körvonalakat és kitöltéseket tárol szöveges utasítások formájában, ami minimális fájlméretet és bármilyen képernyősűrűséghez való alkalmazkodást biztosít. Az Android Developers (2026) dokumentációja szerint a Vector Drawable átlagosan 40–60%-kal csökkenti az APK méretét a különböző felbontású raszter erőforrások készletéhez képest.
Főbb pontok
Vector Drawable egy Android erőforrás, amely vektorképet jelenít meg XML formátumban, az SVG (Scalable Vector Graphics) specifikáció alapján. A Google ezt a formátumot az Android 5.0 (API 21) verzióban vezette be a raszterképek alternatívájaként ikonok, illusztrációk és egyéb grafikus interfészelemek számára.
A PNG-től eltérően, ahol a kép fix méretű pixeltömbként van tárolva, a Vector Drawable matematikailag írja le a formákat — pontok koordinátáin, Bezier-görbéken, kitöltéseken és körvonalakon keresztül. Ez azt jelenti, hogy egyetlen vektorkép akár hat PNG-fájlt is helyettesíthet különböző képernyősűrűségekhez (mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi, nodpi), ami győkeresen leegyszerűsíti a grafikus erőforrások karbantartását.
A formátum nemcsak statikus képeket, hanem animációt is támogat az AnimatedVectorDrawable révén, valamint a sötét témához való alkalmazkodást és egyéni színeket a témaattribútumokon keresztül. Az Android 7.0 (API 24) verziótól kezdve a Vector Drawable támogatja a gradienseket és az összetett vágási műveleteket (clipPath) is, ami kibővíti a tervezési lehetőségeket.
Minden Vector Drawable tartalmazza a vector gyökérelemet szélesség, magasság és viewport paraméterekkel — egy virtuális koordináta-rendszert, amelyben a formák rajzolódnak. Belül csoportok (group) és útvonalak (path) találhatók, ahol a path parancsok sorozatával határozza meg a geometriát: M (moveTo), L (lineTo), C (cubicTo), Z (close) és mások. Minden path-nek lehet saját kitöltése (fillColor) és körvonala (strokeColor), amelyek témaerőforrásokra hivatkozhatnak.
További elemek közé tartozik a clip-path vágáshoz, a gradient átmenetekhez és a sötét témához való alkalmazkodás attribútumai az android:theme attribútumon keresztül. A Vector Drawable-ban lévő összes szín megadható témaattribútumokra való hivatkozként (pl. ?attr/colorPrimary), ami megváltoztatja az ikonok megjelenését a téma váltásakor az erőforrások duplikálása nélkül.
A Vector Drawable XML-fájlja a res/drawable/ könyvtárba kerül, és a <vector> gyökérelemmel rendelkezik. Belül lehetnek egymásba ágyazott <group> elemek a hierarchia szervezéséhez és <path> a körvonalak leírásához. Minden path tartalmazza a pathData attribútumot — egy rajzolóparancsokat tartalmazó sztringet SVG útvonal formátumban.
<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>
A példában egy 10 egység sugarú kör van leírva egy 24×24-es viewport-ban. A fillColor paraméter egy szín erőforrásra hivatkozik, míg a strokeWidth és strokeColor a körvonalat határozza meg. A width és height méretek dp-ben vannak megadva — ez biztosítja a helyes skálázást a különböző pixelsűrűségű képernyőkön további átalakítások nélkül.
A group elem lehetővé teszi több path csoportosítását és közös transzformációk alkalmazását: forgatás (rotation), eltolás (translateX, translateY) és skálázás (scaleX, scaleY). A csoportok egymásba ágyazhatók, ami lehetővé teszi összetett hierarchiák létrehozását tucatnyi elemből teljesítményveszteség nélkül.
<vector ...>
<group android:name="arrow_group"
android:pivotX="12"
android:pivotY="12"
android:rotation="90">
<path .../>
</group>
</vector>
A pivotX/pivotY attribútummal történő csoportosítást animációhoz használják: a kép egy része függetlenül forgatható vagy skálázható a többi elemtől, ami különösen hasznos animált állapotikonok (pl. betöltés → siker) létrehozásához.
A vektor és rasztergrafika közötti választás a használati forgatókönyvtől függ. A Vector Drawable ideális ikonok, illusztrációk és kevés részlettel rendelkező interfészelemek számára, míg a fényképek és ezrek színt tartalmazó összetett képek raszterformátumokban maradnak.
| Paraméter | Vector Drawable | PNG |
|---|---|---|
| Skálázás | Minőségromlás nélkül | Romlás nagyításkor |
| Fájlméret | 0.5–5 KB | 10–100 KB felbontásonként |
| Fájlok száma | 1 XML | 6 PNG (mdpi–xxxhdpi) |
| Animáció | Támogatott | Csak képkockacsere |
| Témaadaptáció | ?attr segítségével | Külön készletek |
| Összetett jelenetek | Korlátozott | Bármilyen |
Az Android Performance Patterns (Google I/O 2016) szerint a PNG-ikonok Vector Drawable-re cserélése 40–60%-kal csökkenti az APK méretét a sok grafikus erőforrással rendelkező alkalmazásoknál. Azonban összetett, tucatnyi path-t tartalmazó vektorok megjelenítésekor a CPU-terhelés megnő, ezért animációkhoz és gyakori újarajzoláshoz a gyorsítótárba helyezett raszterek használata ajánlott.
Vector Drawable optimális interfészikonokhoz (eszköztár, navigáció, állapotok), logókhoz, egyszerű illusztrációkhoz és animált elemekhez. A formátum különösen előnyös több képernyő támogatásakor: hat sűrűséghez PNG generálása helyett egyetlen XML-fájl elegendő. Ez leegyszerűsíti a tervezés karbantartását és kiküszöböli a méret-eltérési hibákat. Fényképekhez és fotorealisztikus átmenetekkel rendelkező képekhez továbbra is WebP tömörítéssel ellátott raszterformátumokat használnak.
Az Android két mechanizmuson keresztül támogatja a Vector Drawable animációját: AnimatedVectorDrawable (API 21-től elérhető) és AnimatedStateListDrawable. Az első lehetővé teszi a path attribútumok animálását — forgatás, eltolás, szín- és formaátváltozás. A második különböző állapotok (nyomás, kiválasztás) között vált sima átmenettel.
Az AnimatedVectorDrawable három XML-fájlt használ: magát a Vector Drawable-t, az ObjectAnimator-t az animáció leírásával és az összekötő AnimatedVectorDrawable-t, amely a target-et (csoport vagy útvonal neve) összeköti az animátorral. Az animáció változtathatja a fillColor, strokeColor, rotation, translateX/Y, scaleX/Y és akár a pathData értékét is — vagyis simán átalakíthatja az egyik formát a másikba (morphing).
Tekintsünk egy animációt, amelyben a „plusz” ikon „keriszt” ikonná alakul át. A fő korlátozás: a pathData parancsok számának meg kell egyeznie a kezdeti és végállapotban, különben az animáció nem működik.
<!-- res/drawable/anim_plus_to_close.xml -->
<animated-vector xmlns:android="...">
<target
android:name="plus_path"
android:animation="@anim/plus_to_close"/>
</animated-vector>
Az ObjectAnimator plus_to_close animáció 300 ezredmásodperc alatt változtatja a pathData tulajdonságot a kezdeti „plusz” formáról a „keriszt” formára. A rendszer automatikusan interpolálja a koordinátákat a két SVG útvonalparancs-készlet között. Az ilyen animációt széles körben használják a Material Design-ban a gombok és ikonok állapotának sima átmeneteihez.
Nézzünk meg egy teljes XML vektor példát a vissza nyíl ikonhoz sötét téma támogatással. A szín egy témaattribútumra való hivatkozással van meghatározva, ami automatikusan megváltoztatja az ikon színét a világos és sötét téma közötti váltáskor, erőforrások duplikálása nélkül.
<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>
Az android:tint paraméter ?attr/colorControlNormal értékkel automatikusan alkalmazza a vezérlőelem rendszerszínét — világos témában ez sötétszürke, sötétben fehér. Az arrow nevű csoport lehetővé teszi ennek az ikonnak az animálását az AnimatedVectorDrawable révén.
A Vector Drawable programozott betöltéséhez Androidban az AppCompatResources.getDrawable() osztály vagy a ContextCompat.getDrawable() metódus használható. Modern Jetpack Compose projektekben a raszter és vektor Drawable-ok a painterResource segítségével tölthetők be, amely automatikusan felismeri az erőforrás formátumát.
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
)
Az AppCompatResources.getDrawable() használatakor az AppCompat könyvtár maga választja ki a megfelelő drawable verziót az API szinttől függően: az Android 5.0 (API 21) előtti eszközökön raszter tartalékverzió (fallback) használható, az újabbakon Vector Drawable. A Jetpack Compose-ban a painterResource automatikusan kezeli ezt a kompatibilitást.
Gyakran ismételt kérdések
A Vector Drawable natívan Android 5.0 (API 21) verziótól támogatott. Az régebbi verziókhoz az AppCompat könyvtárat kell használni (a vektor erőforrások azon keresztül működnek API 7+ eszközökön). Szintén szükséges a vectorDrawables.useSupportLibrary = true jelző a build.gradle-ben.
Igen, a Jetpack Compose támogatja a Vector Drawable-t a painterResource() függvényen keresztül. Az Icon komponens automatikusan betölti a vektor erőforrást a res/drawable/ könyvtárból és alkalmazza a Material témát a tint-hez. A vektorok minőségromlás nélkül nyújthatók bármilyen, a modifier paraméterben megadott méretre.
SVG egy univerzális webes szabvány gazdag funkciókészlettel (szűrők, maszkok, beépített stílusok). A Vector Drawable egy Androidhoz igazított változat korlátozott SVG parancs részhalmazzal. Az Android nem támogatja közvetlenül az SVG-t, csak a Vector Drawable-t, amely az SVG-ből az Android Studio Asset Studio segítségével generálható.
A legegyszerűbb mód az Android Studio használata: jobb gomb a drawable mappán → New → Vector Asset → Import local SVG file. A Studio automatikusan optimalizálja az SVG-t és létrehozza az XML Vector Drawable-t. Más lehetőség az online konverterek, mint például az SVG2VectorDrawable vagy a ShapeShifter, amely támogatja az exportálást animációval.
A probléma általában az AppCompat támogatásának hiányával függ össze. Győződjön meg arról, hogy a build.gradle-ben be van állítva a vectorDrawables.useSupportLibrary = true jelző és az AppCompatDelegate használatban van. Ellenőrizze azt is, hogy a Vector Drawable nem tartalmaz-e olyan funkciókat, amelyek nem érhetőek el a használt AppCompat könyvtár verziójában.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is