Omówienie elementów rysowanych wektorowych

Wypróbuj sposób tworzenia wiadomości
Jetpack Compose to zalecany zestaw narzędzi UI na Androida. Dowiedz się, jak wyświetlać grafikę w oknie tworzenia wiadomości.

Key points

  • Obiekt rysowalny wektorowo to grafika wektorowa zdefiniowana w pliku XML jako zestaw punktów, linii i krzywych wraz z powiązanymi informacjami o kolorze.
  • Elementy rysowalne wektorowe są skalowalne, co oznacza, że można zmieniać ich rozmiar bez utraty jakości wyświetlania. Dzięki temu idealnie sprawdzają się w aplikacjach na Androida, ponieważ pomagają zmniejszyć rozmiar plików APK i zwiększyć wydajność.
  • Możesz tworzyć obiekty rysowalne wektorowe w Android Studio, klikając prawym przyciskiem myszy folder rysowalny w projekcie i wybierając Nowy > Zasób wektorowy. Możesz też importować pliki SVG do Android Studio jako obiekty rysowalne wektorowe.
Podsumowanie wygenerowane przez Barda Google 24 lipca 2023 r.

Wprowadzenie

VectorDrawable to grafika wektorowa zdefiniowana w pliku XML jako zestaw punktów, linii i krzywych wraz z powiązanymi informacjami o kolorze. Główną zaletą użycia elementu rysowalnego wektorowego jest skalowalność obrazu. Można go skalować bez utraty jakości wyświetlania, co oznacza, że rozmiar tego samego pliku jest zmieniany w zależności od gęstości ekranu bez utraty jakości obrazu. Dzięki temu pliki APK są mniejsze, a deweloperzy nie muszą się tak martwić o obsługę. Do animacji możesz też używać obrazów wektorowych, używając wielu plików XML zamiast wielu obrazów dla każdej rozdzielczości wyświetlania.

Na tej stronie oraz w filmie poniżej znajdziesz omówienie tworzenia elementów rysowanych wektorowo w języku XML. Android Studio umożliwia też konwertowanie plików SVG do wektorowego formatu rysowalnego zgodnie z opisem w sekcji Dodawanie grafiki wektorowej o wielu gęstościach.

Android 5.0 (poziom interfejsu API 21) był pierwszą wersją, która oficjalnie obsługiwała obiekty rysowalne wektorowe za pomocą VectorDrawable i AnimatedVectorDrawable, ale starsze wersje możesz obsługiwać za pomocą biblioteki obsługi Androida, która zawiera klasy VectorDrawableCompat i AnimatedVectorDrawableCompat.

Informacje o klasie VectorDrawable

VectorDrawable określa statyczny obiekt rysowalny. Podobnie jak w formacie SVG, każda grafika wektorowa jest zdefiniowana jako hierarchia drzewa, która składa się z obiektów path i group. Każdy element path zawiera geometrię konturu obiektu, a group – szczegóły do przekształcenia. Wszystkie ścieżki są rysowane w tej samej kolejności, w jakiej występują w pliku XML.

Rysunek 1. Przykładowa hierarchia zasobu rysowalnego wektorowo

Narzędzie Vector asset Studio pozwala w prosty sposób dodać grafikę wektorową do projektu jako plik XML.

Przykładowy plik XML

Oto przykładowy plik XML VectorDrawable, który renderuje obraz baterii w trybie ładowania.

<!-- res/drawable/battery_charging.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="24dp"
    android:width="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
   <group
         android:name="rotationGroup"
         android:pivotX="10.0"
         android:pivotY="10.0"
         android:rotation="15.0" >
      <path
        android:name="vect"
        android:fillColor="#FF000000"
        android:pathData="M15.67,4H14V2h-4v2H8.33C7.6,4 7,4.6 7,5.33V9h4.93L13,7v2h4V5.33C17,4.6 16.4,4 15.67,4z"
        android:fillAlpha=".3"/>
      <path
        android:name="draw"
        android:fillColor="#FF000000"
        android:pathData="M13,12.5h2L11,20v-5.5H9L11.93,9H7v11.67C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33V9h-4v3.5z"/>
   </group>
</vector>

Ten plik XML renderuje następujący obraz:

Informacje o klasie LivelyVectorDrawable

AnimatedVectorDrawable dodaje animację do właściwości grafiki wektorowej. Animowaną grafikę wektorową można zdefiniować jako 3 osobne pliki zasobów lub jako pojedynczy plik XML definiujący cały obiekt rysowalny. Aby lepiej zrozumieć te zagadnienia, spójrzmy na wiele plików XML i pojedynczy plik XML.

Wiele plików XML

Dzięki temu można zdefiniować 3 osobne pliki XML:

Przykład wielu plików XML

Poniższe pliki XML pokazują animację grafiki wektorowej.

  • Plik XML VectorDrawable: vd.xml
  • <vector xmlns:android="http://schemas.android.com/apk/res/android"
       android:height="64dp"
       android:width="64dp"
       android:viewportHeight="600"
       android:viewportWidth="600" >
       <group
          android:name="rotationGroup"
          android:pivotX="300.0"
          android:pivotY="300.0"
          android:rotation="45.0" >
          <path
             android:name="vectorPath"
             android:fillColor="#000000"
             android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
       </group>
    </vector>
    
  • Plik XML programuAnimationVectorDrawable: avd.xml
  • <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
       android:drawable="@drawable/vd" >
         <target
             android:name="rotationGroup"
             android:animation="@anim/rotation" />
         <target
             android:name="vectorPath"
             android:animation="@anim/path_morph" />
    </animated-vector>
    
  • Pliki XML animacji używane w pliku XMLAnimationVectorDrawable: rotation.xml i path_morph.xml
  • <objectAnimator
       android:duration="6000"
       android:propertyName="rotation"
       android:valueFrom="0"
       android:valueTo="360" />
    
    <set xmlns:android="http://schemas.android.com/apk/res/android">
       <objectAnimator
          android:duration="3000"
          android:propertyName="pathData"
          android:valueFrom="M300,70 l 0,-70 70,70 0,0   -70,70z"
          android:valueTo="M300,70 l 0,-70 70,0  0,140 -70,0 z"
          android:valueType="pathType"/>
    </set>
    

Pojedynczy plik XML

Dzięki temu możesz scalić powiązane pliki XML w jeden plik XML za pomocą formatu pakietu XML. W momencie tworzenia aplikacji tag aapt tworzy osobne zasoby i odwołuje się do nich w animowanym wektorze. To podejście wymaga narzędzi Build w wersji 24 lub nowszej, a dane wyjściowe są zgodne wstecznie.

Przykład pojedynczego pliku XML

<animated-vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt">
    <aapt:attr name="android:drawable">
        <vector
            android:width="24dp"
            android:height="24dp"
            android:viewportWidth="24"
            android:viewportHeight="24">
            <path
                android:name="root"
                android:strokeWidth="2"
                android:strokeLineCap="square"
                android:strokeColor="?android:colorControlNormal"
                android:pathData="M4.8,13.4 L9,17.6 M10.4,16.2 L19.6,7" />
        </vector>
    </aapt:attr>
    <target android:name="root">
        <aapt:attr name="android:animation">
            <objectAnimator
                android:propertyName="pathData"
                android:valueFrom="M4.8,13.4 L9,17.6 M10.4,16.2 L19.6,7"
                android:valueTo="M6.4,6.4 L17.6,17.6 M6.4,17.6 L17.6,6.4"
                android:duration="300"
                android:interpolator="@android:interpolator/fast_out_slow_in"
                android:valueType="pathType" />
        </aapt:attr>
    </target>
</animated-vector>

Rozwiązanie umożliwiające wsteczną zgodność z obiektami rysowalnymi wektorowymi

Aby umożliwić rysowanie wektorowe i animowane obrazy wektorowe na urządzeniach z platformami w wersji starszej niż 5.0 (poziom interfejsu API 21) lub korzystać z funkcji fillColor, fillType i strokeColor starszych niż Android 7.0 (poziom interfejsu API 24), VectorDrawableCompat i AnimatedVectorDrawableCompat są dostępne w 2 bibliotekach pomocniczych: odpowiednio support-vector-drawable i animated-vector-drawable.

W Android Studio 1.4 wprowadziliśmy ograniczoną obsługę elementów rysowanych wektorowych, generując pliki PNG w trakcie kompilacji. Jednak biblioteki rysowalne wektorowo i animowane wektorowe zapewniają zarówno elastyczność, jak i szeroką zgodność – jest to biblioteka pomocy, więc można jej używać ze wszystkimi wersjami platformy Androida od wersji 2.1 (poziom API 7 lub nowszej). Aby skonfigurować aplikację do korzystania z bibliotek obsługi wektorowej, dodaj element vectorDrawables do pliku build.gradle w module aplikacji.

Aby skonfigurować element vectorDrawables, użyj tego fragmentu kodu:

Odlotowy

// For Gradle Plugin 2.0+
android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}

Kotlin

// For Gradle Plugin 2.0+
android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}

Odlotowy

// For Gradle Plugin 1.5 or below
android {
    defaultConfig {
        // Stops the Gradle plugin’s automatic rasterization of vectors
        generatedDensities = []
    }
    // Flag notifies aapt to keep the attribute IDs around
    aaptOptions {
        additionalParameters "--no-version-vectors"
    }
}

Kotlin

// For Gradle Plugin 1.5 or below
android {
    defaultConfig {
        // Stops the Gradle plugin’s automatic rasterization of vectors
        generatedDensities()
    }
    // Flag notifies aapt to keep the attribute IDs around
    aaptOptions {
        additionalParameters("--no-version-vectors")
    }
}

Możesz używać VectorDrawableCompat i AnimatedVectorDrawableCompat na wszystkich urządzeniach z Androidem 4.0 (poziom interfejsu API 14) lub nowszym. Sposób ładowania elementów rysowalnych na Androidzie, a nie każde miejsce, które akceptuje rysowalny identyfikator, np. w pliku XML, obsługuje rysowalne obiekty wektorowe. Do pakietu android.support.v7.appcompat dodano szereg funkcji ułatwiających korzystanie z obiektów rysowalnych wektorowych. Po pierwsze, gdy używasz pakietu android.support.v7.appcompat z ImageView lub z podklasami, takimi jak ImageButton czy FloatingActionButton, możesz użyć nowego atrybutu app:srcCompat, aby odwołać się do elementów rysowalnych wektorowych, a także innych elementów, które są rysowalne w android:src:

<ImageView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  app:srcCompat="@drawable/ic_add" />

Aby zmienić elementy rysowalne w czasie działania, możesz użyć metody setImageResource() tak jak wcześniej. Użycie znaczników AppCompat i app:srcCompat to najefektywniejsza metoda integracji elementów rysowalnych wektorowych z aplikacją.

Biblioteka pomocy w wersji 25.4.0 lub nowszej obsługuje te funkcje:

  • Zmiana ścieżki (sprawdzanie typu ścieżki) służy do przekształcenia jednej ścieżki w inną.
  • Interpolacja ścieżki służy do definiowania interpolatora elastycznego (reprezentowanego jako ścieżka) zamiast interpolatorów zdefiniowanych w systemie, takich jak LinearInterpolator.

Biblioteka pomocy w wersji 26.0.0-beta1 i nowszych obsługuje te funkcje:

  • Przesuwaj się po ścieżce: obiekt geometryczny może się przemieszczać wzdłuż dowolnej ścieżki w ramach animacji.

Przykład użycia wielu plików XML za pomocą biblioteki pomocy

Poniższe pliki XML pokazują sposób użycia wielu plików XML do animowania grafiki wektorowej.

  • Plik XML VectorDrawable: vd.xml
  • <vector xmlns:android="http://schemas.android.com/apk/res/android"
       android:height="64dp"
       android:width="64dp"
       android:viewportHeight="600"
       android:viewportWidth="600" >
       <group
          android:name="rotationGroup"
          android:pivotX="300.0"
          android:pivotY="300.0"
          android:rotation="45.0" >
          <path
             android:name="vectorPath"
             android:fillColor="#000000"
             android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
       </group>
    </vector>
    
  • Plik XML programuAnimationVectorDrawable: avd.xml
  • <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
       android:drawable="@drawable/vd" >
         <target
             android:name="rotationGroup"
             android:animation="@anim/rotation" />
    </animated-vector>
    
  • Plik XML programu Animator używany w pliku XML interfejsuAnimationVectorDrawable: rotation.xml
  • <objectAnimator
       android:duration="6000"
       android:propertyName="rotation"
       android:valueFrom="0"
       android:valueTo="360" />
    

Pojedynczy plik XML

Poniższy plik XML przedstawia sposób użycia pojedynczego pliku XML do animowania grafiki wektorowej. W momencie tworzenia aplikacji tag aapt tworzy osobne zasoby i odwołuje się do nich w animowanym wektorze. To podejście wymaga narzędzi Build w wersji 24 lub nowszej, a dane wyjściowe są zgodne wstecznie.

Przykład pojedynczego pliku XML za pomocą biblioteki pomocy

<animated-vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt">
    <aapt:attr name="android:drawable">
        <vector xmlns:android="http://schemas.android.com/apk/res/android"
            android:width="64dp"
            android:height="64dp"
            android:viewportWidth="600"
            android:viewportHeight="600">
            <group
                android:name="rotationGroup"
                android:pivotX="300"
                android:pivotY="300"
                android:rotation="45.0" >
                <path
                    android:name="vectorPath"
                    android:fillColor="#000000"
                    android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
            </group>
        </vector>
    </aapt:attr>
    <target android:name="rotationGroup">
        <aapt:attr name="android:animation">
            <objectAnimator
                android:propertyName="rotation"
                android:valueFrom="0"
                android:valueTo="360"
                android:duration="6000"
                android:interpolator="@android:interpolator/fast_out_slow_in" />
        </aapt:attr>
    </target>
</animated-vector>