Vector Drawable: vad är det, XML-format och hur det fungerar

Författare: IT Sectr Publicerad: 2026-06-12 Lästid: 9 min

Vector Drawable är ett vektorgrafikformat för Android baserat på XML som möjliggör skapande av skalbara bilder utan kvalitetsförlust. Till skillnad från PNG och JPEG lagrar vektorn geometriska konturer och fyllningar som textinstruktioner, vilket ger minimal filstorlek och anpassning till vilken skärmtäthet som helst. Enligt dokumentationen för Android Developers (2026) minskar Vector Drawable APK-storleken med i genomsnitt 40–60% jämfört med en uppsättning rasterresurser för olika upplösningar.

Huvudpunkter

  • Vector Drawable — XML-baserat vektorgrafikformat för Android, standardiserat från API 21
  • Skalning utan kvalitetsförlust — vektorn anpassar sig till vilken skärmtäthet som helst (mdpi, hdpi, xhdpi och högre)
  • APK-storlek minskas med 40–60% genom att ersätta flera PNG-filer med en enda XML-fil
  • Animation stöds via AnimatedVectorDrawable och AnimatedStateListDrawable
  • Anpassning till mörkt tema realiseras med attributet android:theme utan att duplicera resurser

Vad är Vector Drawable?

Vector Drawable är en Android-resurs som representerar en vektorbild i XML-format, baserad på SVG-specifikationen (Scalable Vector Graphics). Google introducerade detta format i Android 5.0 (API 21) som ett alternativ till rasterbilder för ikoner, illustrationer och andra grafiska gränssnittselement.

Till skillnad från PNG, där bilden lagras som en matris av pixlar med fast storlek, beskriver Vector Drawable former matematiskt — genom punktkoordinater, Bezier-kurvor, fyllningar och konturer. Detta innebär att en enda vektorbild kan ersätta upp till sex PNG-filer för olika skärmtätheter (mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi, nodpi), vilket radikalt förenklar underhållet av grafiska resurser.

Formatet stödjer inte bara statiska bilder, utan även animation via AnimatedVectorDrawable, samt anpassning till mörkt tema och anpassade färger via temaattribut. Från och med Android 7.0 (API 24) stödjer Vector Drawable även gradientfyllningar och komplexa klippoperationer (clipPath), vilket utökar designmöjligheterna.

Huvudkomponenter i Vector Drawable

Varje Vector Drawable innehåller rotelementet vector med parametrar för bredd, höjd och viewport — ett virtuellt koordinatsystem där former ritas. Inuti finns grupper (group) och sökvägar (path), där path definierar geometrin genom en sekvens av kommandon: M (moveTo), L (lineTo), C (cubicTo), Z (close) och andra. Varje path kan ha sin egen fyllning (fillColor) och kontur (strokeColor), som kan referera till temaresurser.

Ytterligare element inkluderar clip-path för klippning, gradient för gradientövergångar och attribut för anpassning till mörkt tema via attributet android:theme. Alla färger i Vector Drawable kan definieras som referenser till temaattribut (t.ex. ?attr/colorPrimary), vilket ändrar utseendet på ikoner vid temaväxling utan att duplicera resurser.

Vector Drawable-format: XML-struktur

XML-filen för Vector Drawable placeras i katalogen res/drawable/ och har rotelementet <vector>. Inuti kan det finnas nästlade <group> för organisering av hierarki och <path> för beskrivning av konturer. Varje path innehåller attributet pathData — en sträng med ritkommandon i SVG-sökvägsformat.

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>

I exemplet beskrivs en cirkel med radien 10 enheter i en viewport på 24×24. Parametern fillColor refererar till en färgresurs, medan strokeWidth och strokeColor definierar konturen. Måtten width och height anges i dp — detta säkerställer korrekt skalning på skärmar med olika pixeltäthet utan ytterligare transformationer.

Gruppering och transformationer

Elementet group gör det möjligt att gruppera flera path och tillämpa gemensamma transformationer: rotation, förskjutning (translateX, translateY) och skalning (scaleX, scaleY). Grupper kan vara nästlade, vilket möjliggör skapandet av komplexa hierarkier med hundratals element utan prestandaförlust.

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

Gruppering med attributet pivotX/pivotY används för animation: en del av bilden kan roteras eller skaleras oberoende av andra element, vilket är särskilt användbart för att skapa animerade statusikoner (t.ex. laddning → framgång).

Vector Drawable vs rastergrafik

Valet mellan vektor- och rastergrafik beror på användningsscenariot. Vector Drawable är idealiskt för ikoner, illustrationer och gränssnittselement med få detaljer, medan fotografier och komplexa bilder med tusentals färger förblir i rasterformat.

ParameterVector DrawablePNG
SkalningUtan kvalitetsförlustFörlust vid förstoring
Filstorlek0.5–5 KB10–100 KB per upplösning
Antal filer1 XML6 PNG (mdpi–xxxhdpi)
AnimationStödsEndast bildväxling
TemaanpassningVia ?attrSeparata uppsättningar
Komplexa scenerBegränsatAlla

Enligt Android Performance Patterns (Google I/O 2016) minskar utbyte av PNG-ikoner mot Vector Drawable APK-storleken med 40–60% för appar med många grafiska resurser. Vid rendering av komplexa vektorer med hundratals path ökar dock CPU-belastningen, så för animationer och frekvent omritning rekommenderas användning av cachade rastrer.

När ska man välja Vector Drawable

Vector Drawable är optimalt för gränssnittsikoner (verktygsfält, navigering, statusar), logotyper, enkla illustrationer och animerade element. Formatet är särskilt fördelaktigt vid stöd för flera skärmar: istället för att generera PNG för sex tätheter räcker en enda XML-fil. Detta förenklar designunderhållet och eliminerar storleksavvikelsefel. För fotografier och bilder med fotorealistiska gradienter används fortfarande rasterformat med WebP-komprimering.

Vector Drawable-animation

Android stödjer Vector Drawable-animation genom två mekanismer: AnimatedVectorDrawable (tillgänglig från API 21) och AnimatedStateListDrawable. Den första möjliggör animering av path-attribut — rotation, förskjutning, färg- och formändring. Den andra växlar mellan olika tillstånd (tryck, markering) med smidig övergång.

AnimatedVectorDrawable använder tre XML-filer: själva Vector Drawable, ObjectAnimator med animationsbeskrivning och den sammanbindande AnimatedVectorDrawable som kopplar target (namn på grupp eller sökväg) till animatorn. Animationen kan ändra fillColor, strokeColor, rotation, translateX/Y, scaleX/Y och även pathData — det vill säga smidigt omvandla en form till en annan (morphing).

Exempel på morphing-animation

Betrakta en animation där ikonen „plus” förvandlas till „kors”. Huvudbegränsningen: antalet pathData-kommandon måste vara samma i början och sluttillståndet, annars fungerar inte animationen.

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 ändrar egenskapen pathData från den ursprungliga „plus”-formen till „kors”-formen på 300 millisekunder. Systemet interpolerar automatiskt koordinaterna mellan de två uppsättningarna SVG-sökvägskommandon. Sådan animation används flitigt i Material Design för smidiga övergångar av knapp- och ikontillstånd.

Exempel på Vector Drawable-kod

Låt oss titta på ett komplett exempel på en XML-vektor för ikonen tillbaka-pil med stöd för mörkt tema. Färgen definieras via en referens till ett temaattribut, vilket automatiskt ändrar ikonens färg vid växling mellan ljust och mörkt tema utan att duplicera resurser.

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>

Parametern android:tint med värdet ?attr/colorControlNormal tillämpar automatiskt systemfärgen för kontrollenheten — i ljust tema är den mörkgrå, i mörkt tema vit. Gruppen med namnet arrow gör det möjligt att animera denna ikon via AnimatedVectorDrawable.

Ladda Vector Drawable från kod

För att programmatiskt ladda Vector Drawable i Android används klassen AppCompatResources.getDrawable() eller metoden ContextCompat.getDrawable(). I moderna projekt med Jetpack Compose laddas raster- och vektor-Drawable via painterResource, som automatiskt detekterar resursformatet.

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
)

Vid användning av AppCompatResources.getDrawable() väljer AppCompat-biblioteket själv rätt version av drawable beroende på API-nivå: på enheter äldre än Android 5.0 (API 21) kan en rasterreservversion (fallback) användas, på nyare enheter Vector Drawable. I Jetpack Compose hanterar painterResource denna kompatibilitet automatiskt.

Vanliga frågor

Från vilken Android-version stöds Vector Drawable?

Vector Drawable stöds inbyggt från Android 5.0 (API 21). För äldre versioner måste AppCompat-biblioteket användas (vektorresurser fungerar genom det på enheter med API 7+). Även flaggan vectorDrawables.useSupportLibrary = true krävs i build.gradle.

Kan Vector Drawable användas i Jetpack Compose?

Ja, Jetpack Compose stödjer Vector Drawable via funktionen painterResource(). Komponenten Icon laddar automatiskt vektorresursen från res/drawable/ och tillämpar Material-temat för tint. Vektorer sträcks utan kvalitetsförlust till vilken storlek som helst som anges via parametern modifier.

Vad är skillnaden mellan Vector Drawable och SVG?

SVG är en universell webbstandard med en rik uppsättning funktioner (filter, masker, inbyggda stilar). Vector Drawable är en anpassad version för Android med en begränsad delmängd av SVG-kommandon. Android stödjer inte SVG direkt, bara Vector Drawable som genererats från SVG via Android Studio Asset Studio.

Hur konverterar man SVG till Vector Drawable?

Det enklaste sättet är att använda Android Studio: högerklicka på drawable-mappen → New → Vector Asset → Import local SVG file. Studio optimerar automatiskt SVG och genererar XML Vector Drawable. Ett annat alternativ är online-konverterare som SVG2VectorDrawable eller ShapeShifter, som stödjer export med animation.

Varför visas inte Vector Drawable på äldre enheter?

Problemet beror vanligtvis på bristande AppCompat-stöd. Se till att flaggan vectorDrawables.useSupportLibrary = true är inställd i build.gradle och att AppCompatDelegate används. Kontrollera även att Vector Drawable inte innehåller funktioner som inte är tillgängliga i den använda versionen av AppCompat-biblioteket.

Sammanfattning

  • Vector Drawable — XML-baserat vektorgrafikformat för Android, standardiserat från API 21
  • Skalning utan kvalitetsförlust — en XML-fil ersätter sex rasterbilder för olika tätheter
  • APK-storlek minskas med 40–60% vid byte av PNG-ikoner till vektormotsvarigheter
  • Animation realiseras via AnimatedVectorDrawable med stöd för formmorphing och färgändring
  • Mörkt tema stöds via attributen ?attr/colorControlNormal och android:theme
  • AppCompat säkerställer bakåtkompatibilitet ner till Android 2.3 (API 7) via useSupportLibrary
  • Använd Vector Drawable för ikoner och gränssnittselement, PNG/WebP för fotorealistiska bilder

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också