Pojęcia i implementacja w Jetpack Compose
Android Studio zawiera narzędzie o nazwie Vector Asset Studio, które pomaga dodawać ikony w stylu Material Design oraz importować do projektu pliki SVG (Scalable Vector Graphic) i Adobe Photoshop Document (PSD) jako zasoby obiektów rysowalnych wektorowo. Używanie obiektów rysowalnych wektorowo zamiast bitmap zmniejsza rozmiar pliku APK, ponieważ ten sam plik można skalować do różnych gęstości ekranu bez utraty jakości obrazu. W przypadku starszych wersji Androida, które nie obsługują obiektów rysowalnych wektorowo, narzędzie Vector Asset Studio może w czasie kompilacji przekształcić obiekty rysowalne wektorowo w różne rozmiary bitmap dla każdej gęstości ekranu.
Informacje o Vector Asset Studio
Vector Asset Studio dodaje do projektu grafikę wektorową jako plik XML, który opisuje obraz. Prowadzenie jednego pliku XML może być łatwiejsze niż aktualizowanie wielu grafik rastrowych w różnych rozdzielczościach.
Android 4.4 (poziom interfejsu API 20) i starsze wersje nie obsługują rysunków wektorowych. Jeśli minimalny poziom interfejsu API jest ustawiony na jeden z tych poziomów, podczas korzystania z Vector Asset Studio masz 2 opcje: wygenerować pliki PNG (domyślnie) lub użyć techniki zgodności wstecznej w Androidzie X.
Aby zapewnić zgodność wsteczną, narzędzie Vector Asset Studio generuje obrazy rastrowe obiektu rysowalnego wektorowo. Grafiki wektorowe i rastrowe są pakowane razem w pliku APK. Do rysunków wektorowych możesz odwoływać się w kodzie Java jako Drawable lub w kodzie XML jako @drawable. Gdy aplikacja jest uruchomiona, odpowiedni obraz wektorowy lub rastrowy wyświetla się automatycznie w zależności od poziomu interfejsu API.
Zgodność wsteczna w AndroidzieX
Ta technika wymaga Androida X w wersji 1.0 lub nowszej oraz wtyczki Androida do Gradle w wersji 3.2 lub nowszej i korzysta tylko z rysunków wektorowych. Klasa
VectorDrawableCompat w AndroidX umożliwia obsługę
VectorDrawable na Androidzie 2.1 (poziom interfejsu API 7) i nowszych wersjach.
Zanim zaczniesz korzystać z Vector Asset Studio, musisz dodać do pliku build.gradle to oświadczenie:
Dynamiczny
android { defaultConfig { vectorDrawables.useSupportLibrary = true } } dependencies { implementation 'androidx.appcompat:appcompat:1.7.1' }
Kotlin
android { defaultConfig { vectorDrawables.useSupportLibrary = true } } dependencies { implementation("androidx.appcompat:appcompat:1.7.1") }
Musisz też używać technik kodowania AndroidX, aby zapewnić wsteczną zgodność, np. używać atrybutu app:srcCompat zamiast atrybutu android:src w przypadku rysunków wektorowych. Więcej informacji znajdziesz w sekcji AndroidX.
Dodawanie obiektu rysowalnego wektorowo do układu
W pliku układu możesz ustawić dowolny widżet związany z ikonami, np. ImageButton, ImageView itp., tak aby wskazywał obiekt rysowalny wektorowo.
Na przykład poniższy układ pokazuje obiekt rysowalny wektorowo wyświetlany na przycisku:
Rysunek 1. Obiekt rysowalny wektorowo wyświetlany na przycisku w układzie.
Aby wyświetlić obiekt rysowalny wektorowo w widżecie, jak pokazano na rysunku:
Otwórz projekt i zaimportuj rysunek wektorowy.
W tym przykładzie użyto projektu na telefony i tablety wygenerowanego za pomocą kreatora nowego projektu.
W widoku Androida okna Project (Projekt) kliknij dwukrotnie plik XML układu, np.
content_main.xml.Kliknij kartę Projekt, aby wyświetlić edytor układu.
Przeciągnij widżet
ImageButtonz okna Paleta do edytora układu.W oknie Zasoby w panelu po lewej stronie wybierz Drawable, a następnie wybierz zaimportowany obiekt rysowalny wektorowo. Kliknij OK.
Obiekt rysowalny wektorowo pojawi się w
ImageButtonw układzie.Aby zmienić kolor obrazu na kolor uzupełniający zdefiniowany w motywie, w oknie Właściwości znajdź właściwość odcień i kliknij … .
W oknie dialogowym Zasoby w panelu po lewej stronie kliknij Kolor, a następnie wybierz colorAccent. Kliknij OK.
Kolor obrazu zmieni się na kolor uzupełniający w układzie.
Jeśli projekt korzysta z AndroidX, kod ImageButton powinien wyglądać podobnie do tego:
<ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@drawable/ic_build_black_24dp" tools:layout_editor_absoluteX="11dp" tools:layout_editor_absoluteY="225dp" android:id="@+id/imageButton" android:tint="@color/colorAccent" />
Jeśli projekt nie korzysta z AndroidaX, kod obiektu rysowalnego wektorowo będzie wyglądać tak: android:src="@drawable/ic_build_black_24dp".
Odwoływanie się do obiektu rysowalnego wektorowo w kodzie
Zwykle możesz odwoływać się do obiektu rysowalnego wektorowo w ogólny sposób w kodzie, a gdy aplikacja jest uruchomiona, odpowiedni obraz wektorowy lub rastrowy wyświetla się automatycznie w zależności od poziomu interfejsu API:
W większości przypadków do rysunków wektorowych możesz odwoływać się w kodzie XML jako
@drawablelub w kodzie Java jakoDrawable.Na przykład ten kod XML układu stosuje obraz do widoku:
<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/myimage" />
Poniższy kod pobiera obraz jako
Drawable:Kotlin
val drawable = resources.getDrawable(R.drawable.myimage, theme)
Java
Resources res = getResources(); Drawable drawable = res.getDrawable(R.drawable.myimage, getTheme());
Metoda
getResources()znajduje się w klasieContext, która ma zastosowanie do obiektów interfejsu, takich jak aktywności, fragmenty, układy, widoki itp.Jeśli Twoja aplikacja korzysta z AndroidX (nawet jeśli w pliku nie masz instrukcji
vectorDrawables.useSupportLibrary = true), możesz też odwoływać się do rysunku wektorowego za pomocą instrukcjiapp:srcCompat.build.gradlePrzykład:<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" app:srcCompat="@drawable/myimage" />
Czasami może być konieczne rzutowanie obiektu rysowalnego na jego dokładną klasę, np. gdy chcesz użyć określonych funkcji klasy
VectorDrawable. Możesz to zrobić za pomocą kodu takiego jak ten:Kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val vectorDrawable = drawable as VectorDrawable } else { val bitmapDrawable = drawable as BitmapDrawable }
Java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { VectorDrawable vectorDrawable = (VectorDrawable) drawable; } else { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; }
Do zasobów obiektów rysowalnych wektorowo możesz uzyskać dostęp tylko z głównego wątku.
Na Androidzie 5.0 (poziom interfejsu API 21) i nowszych możesz używać klasy
AnimatedVectorDrawable do animowania właściwości klasy
VectorDrawable. W AndroidzieX możesz używać klasy
AnimatedVectorDrawableCompat do animowania klasy VectorDrawable
na Androidzie 3.0 (poziom interfejsu API 11) i nowszych. Więcej informacji znajdziesz w artykule Animowanie grafiki rysowanej.