Najważniejsze punkty
- Obiekt rysowalny wektorowo to grafika wektorowa zdefiniowana w pliku XML jako zbiór punktów, linii i krzywych wraz z powiązanymi informacjami o kolorach.
- Grafiki wektorowe są skalowalne, co oznacza, że można zmieniać ich rozmiar bez utraty jakości wyświetlania. Dzięki temu idealnie nadają się do użycia w aplikacjach na Androida, ponieważ mogą pomóc zmniejszyć rozmiar plików APK i poprawić wydajność.
- Grafiki wektorowe możesz tworzyć w Android Studio, klikając prawym przyciskiem myszy folder drawable w projekcie i wybierając New > Vector Asset (Nowy > Zasób wektorowy). Możesz też importować pliki SVG do Android Studio jako grafiki wektorowe.
Wprowadzenie
AVectorDrawable to grafika wektorowa zdefiniowana
w pliku XML jako zbiór punktów, linii i krzywych wraz z powiązanymi
informacjami o kolorach. Główną zaletą używania obiektu rysowalnego wektorowo jest skalowalność obrazu. Można ją skalować bez utraty jakości wyświetlania, co oznacza, że ten sam plik jest zmieniany pod kątem różnych gęstości ekranu bez utraty jakości obrazu.
Dzięki temu pliki APK są mniejsze, a deweloperzy muszą poświęcać mniej czasu na konserwację. Możesz też
używać obrazów wektorowych do animacji, używając wielu plików XML zamiast wielu
obrazów dla każdej rozdzielczości wyświetlania.
Na tej stronie i w filmie poniżej znajdziesz omówienie tworzenia grafik wektorowych w formacie XML. Android Studio może też konwertować pliki SVG na format obiektu rysowalnego wektorowo, jak opisano w artykule Dodawanie grafiki wektorowej o wielu gęstościach.
Android 5.0 (poziom API 21) był pierwszą wersją, która oficjalnie obsługiwała grafiki wektorowe za pomocą
VectorDrawable
i AnimatedVectorDrawable, ale
możesz obsługiwać starsze wersje za pomocą biblioteki pomocy Androida, która udostępnia
VectorDrawableCompat i
AnimatedVectorDrawableCompat klasy.
Informacje o klasie VectorDrawable
VectorDrawable definiuje statyczny obiekt rysowalny. Podobnie jak w przypadku formatu SVG każda grafika wektorowa jest definiowana jako hierarchia drzewa
, która składa się z obiektów path i group.
Każdy obiekt path zawiera geometrię konturu obiektu, a obiekt
group – szczegóły dotyczące transformacji. Wszystkie ścieżki są rysowane
w tej samej kolejności, w jakiej występują w pliku XML.
Rysunek 1. Przykładowa hierarchia zasobu obiektu rysowalnego wektorowo
Narzędzie Studio zasobów wektorowych umożliwia łatwe dodawanie grafiki wektorowej do projektu jako pliku XML.
Przykład w formacie 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 kod XML renderuje ten obraz:
Informacje o klasie AnimatedVectorDrawable
AnimatedVectorDrawable dodaje animację do właściwości grafiki wektorowej. Animowaną grafikę wektorową możesz zdefiniować jako 3 osobne pliki zasobów lub jako jeden plik XML definiujący cały obiekt rysowalny. Aby lepiej zrozumieć, przyjrzyjmy się obu podejściom: wiele plików XML i jeden
plik XML.
Wiele plików XML
W tym podejściu możesz zdefiniować 3 osobne pliki XML:
- plik XML
VectorDrawable. -
plik XML
AnimatedVectorDrawable, który definiuje docelowy elementVectorDrawable, docelowe ścieżki i grupy do animacji, właściwości oraz animacje zdefiniowane jako obiektyObjectAnimatorlubAnimatorSet. - plik XML animatora.
Przykład wielu plików XML
Te 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 AnimatedVectorDrawable:
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 animatora używane w pliku XML AnimatedVectorDrawable
file:
rotation.xmlipath_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>
Jeden plik XML
W tym podejściu możesz połączyć powiązane pliki XML w jeden
plik XML za pomocą formatu pakietu XML. Podczas tworzenia aplikacji tag
aapt tworzy osobne zasoby i odwołuje się do nich w
animowanej grafice wektorowej. To podejście wymaga narzędzi do kompilacji w wersji 24 lub nowszej, a dane wyjściowe są zgodne wstecz.
Przykład jednego 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 zapewniające zgodność wsteczną grafik wektorowych
Aby obsługiwać obiekt rysowalny wektorowo i animowany obiekt rysowalny wektorowo na urządzeniach z platformą w wersji niższej
niż Android 5.0 (poziom API 21) lub używać funkcji fillColor, fillType i
strokeColor w wersjach Androida starszych niż 7.0 (poziom API 24),
klasy VectorDrawableCompat
i AnimatedVectorDrawableCompat
są dostępne w 2 Bibliotekach pomocy:
support-vector-drawable i animated-vector-drawable,
.
Android Studio 1.4 wprowadził ograniczoną obsługę zgodności z grafikami wektorowymi
, generując pliki PNG podczas kompilacji. Biblioteki pomocy dotyczące obiektów rysowalnych wektorowo
i animowanych obiektów rysowalnych wektorowo zapewniają jednak zarówno elastyczność, jak i
szeroką zgodność – jest to Biblioteka pomocy, więc możesz jej używać we wszystkich
wersjach platformy Androida, począwszy od Androida 2.1 (poziom API 7+). Aby skonfigurować
aplikację do korzystania z bibliotek pomocy dotyczących obiektów rysowalnych wektorowo, dodaj element vectorDrawables
do pliku build.gradle w module aplikacji.
Aby skonfigurować element vectorDrawables
, użyj tego fragmentu kodu:
Dynamiczny
// For Gradle Plugin 2.0+ android { defaultConfig { vectorDrawables.useSupportLibrary = true } }
Kotlin
// For Gradle Plugin 2.0+ android { defaultConfig { vectorDrawables.useSupportLibrary = true } }
Dynamiczny
// 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") } }
Klas VectorDrawableCompat
i
AnimatedVectorDrawableCompat możesz używać na wszystkich
urządzeniach z Androidem 4.0 (poziom API 14) lub nowszym. Sposób, w jaki Android
wczytuje obiekty rysowalne, sprawia, że nie każde miejsce, które akceptuje identyfikator obiektu rysowalnego, np. w pliku XML
obsługuje wczytywanie obiektów rysowalnych wektorowo. Pakiet
android.support.v7.appcompat dodał kilka funkcji, które ułatwiają korzystanie z grafik wektorowych. Po pierwsze, gdy używasz
android.support.v7.appcompat pakietu z
ImageView lub z podklasami takimi jak
ImageButton i
FloatingActionButton, możesz
użyć nowego atrybutu app:srcCompat, aby odwoływać się do obiektów rysowalnych wektorowo
oraz do innych obiektów rysowalnych dostępnych w android:src:
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@drawable/ic_add" />
Aby zmieniać grafiki w czasie działania aplikacji, możesz użyć metody
setImageResource()
jak wcześniej. Używanie AppCompat
i app:srcCompat to najbardziej niezawodna metoda integrowania
grafik wektorowych z aplikacją.
Biblioteka pomocy w wersji 25.4.0 i nowszych obsługuje te funkcje:
- Przekształcanie ścieżki (ocena PathType) Używane do przekształcania jednej ścieżki w inną.
- Interpolacja ścieżki Używana do definiowania elastycznego interpolatora (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:
- Przesuwanie wzdłuż ścieżki Obiekt geometryczny może się przesuwać wzdłuż dowolnej ścieżki w ramach animacji.
Przykład wielu plików XML używających biblioteki pomocy
Te pliki XML pokazują podejście polegające na używaniu 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 AnimatedVectorDrawable:
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 animatora używany w pliku XML AnimatedVectorDrawable:
plik:
rotation.xml -
<objectAnimator android:duration="6000" android:propertyName="rotation" android:valueFrom="0" android:valueTo="360" />
Jeden plik XML
Ten plik XML pokazuje podejście polegające na używaniu jednego pliku XML
do animowania grafiki wektorowej. Podczas tworzenia aplikacji tag
aapt tworzy osobne zasoby i odwołuje się do nich w
animowanej grafice wektorowej. To podejście wymaga narzędzi do kompilacji w wersji 24 lub nowszej, a dane wyjściowe są zgodne wstecz.
Przykład jednego pliku XML używającego 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>