Konzepte und Jetpack Compose-Implementierung
Android Studio enthält das Tool „Vector Asset Studio“, mit dem Sie Material-Symbole hinzufügen und SVG-Dateien (Scalable Vector Graphics) und PSD-Dateien (Adobe Photoshop Document) als Vektordrawable-Ressourcen in Ihr Projekt importieren können. Wenn Sie Vektordrawables anstelle von Bitmaps verwenden, wird die Größe Ihrer APK reduziert, da dieselbe Datei für verschiedene Bildschirmdichten skaliert werden kann, ohne dass die Bildqualität darunter leidet. Bei älteren Android-Versionen, die keine Vektordrawables unterstützen, kann Vector Asset Studio zur Build-Zeit Ihre Vektordrawables in verschiedene Bitmap-Größen für jede Bildschirmdichte umwandeln.
Vector Asset Studio
Vector Asset Studio fügt dem Projekt eine Vektorgrafik als XML-Datei hinzu, die das Bild beschreibt. Die Verwaltung einer XML-Datei kann einfacher sein als die Aktualisierung mehrerer Rastergrafiken in verschiedenen Auflösungen.
Android 4.4 (API-Level 20) und niedriger unterstützt keine Vektordrawables. Wenn Ihr Mindest-API-Level auf eines dieser API-Levels festgelegt ist, haben Sie zwei Möglichkeiten, wenn Sie Vector Asset Studio verwenden: PNG-Dateien (Portable Network Graphic) generieren (Standard) oder die Abwärtskompatibilitätstechnik in AndroidX verwenden.
Aus Gründen der Abwärtskompatibilität generiert Vector Asset Studio Rasterbilder des Vektordrawables. Die Vektor- und Raster-Drawables werden zusammen im APK verpackt. Sie können in Java-Code als Drawable oder in XML-Code als @drawable auf Vektordrawables verweisen. Wenn Ihre App ausgeführt wird, wird je nach API-Level automatisch das entsprechende Vektor- oder Rasterbild angezeigt.
Abwärtskompatibilität in AndroidX
Für diese Technik sind AndroidX 1.0 oder höher und das Android-Plug-in für Gradle 3.2 oder höher erforderlich. Außerdem werden nur Vektordrawables verwendet. Mit der Klasse VectorDrawableCompat in AndroidX können Sie VectorDrawable in Android 2.1 (API-Level 7) und höher unterstützen.
Bevor Sie Vector Asset Studio verwenden können, müssen Sie Ihrer Datei build.gradle eine Anweisung hinzufügen:
Groovy
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") }
Außerdem müssen Sie AndroidX-Codierungstechniken für die Abwärtskompatibilität verwenden, z. B. das Attribut app:srcCompat anstelle des Attributs android:src für Vektordrawables. Weitere Informationen finden Sie unter AndroidX.
Vektor-Drawable einem Layout hinzufügen
In einer Layoutdatei können Sie jedes symbolbezogene Widget, z. B. ImageButton und ImageView, auf ein Vektordrawable verweisen lassen.
Im folgenden Layout wird beispielsweise eine Vektorgrafik auf einem Button angezeigt:
Abbildung 1. Ein Vektor-Drawable, das auf einer Schaltfläche in einem Layout angezeigt wird.
So zeigen Sie ein Vektor-Drawable in einem Widget an, wie in der Abbildung dargestellt:
Öffnen Sie ein Projekt und importieren Sie eine Vektordrawable-Datei.
In diesem Beispiel wird ein Smartphone-/Tablet-Projekt verwendet, das mit dem Assistenten für neue Projekte erstellt wurde.
Doppelklicken Sie in der Android-Ansicht des Fensters Projekt auf eine XML-Layoutdatei, z. B.
content_main.xml.Klicken Sie auf den Tab Design, um den Layout-Editor aufzurufen.
Ziehen Sie das
ImageButton-Widget aus dem Fenster Palette in den Layout-Editor.Wählen Sie im Dialogfeld Ressourcen im linken Bereich Drawable und dann das importierte Vektordrawable aus. Klicken Sie auf OK.
Die Vektorgrafik wird auf dem
ImageButtonim Layout angezeigt.Wenn Sie die Farbe des Bildes in die im Design definierte Akzentfarbe ändern möchten, suchen Sie im Fenster Eigenschaften die Eigenschaft Färbung und klicken Sie auf … .
Wählen Sie im Dialogfeld Ressourcen im linken Bereich Farbe und dann colorAccent aus. Klicken Sie auf Ok.
Die Farbe des Bildes ändert sich in die Akzentfarbe des Layouts.
Wenn im Projekt AndroidX verwendet wird, sollte der ImageButton-Code so aussehen:
<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" />
Wenn im Projekt kein AndroidX verwendet wird, lautet der Code für Vektordrawables stattdessen android:src="@drawable/ic_build_black_24dp".
Auf ein Vektor-Drawable im Code verweisen
Normalerweise können Sie in Ihrem Code auf generische Weise auf eine Vektordrawable-Ressource verweisen. Wenn Ihre App ausgeführt wird, wird je nach API-Level automatisch das entsprechende Vektor- oder Rasterbild angezeigt:
In den meisten Fällen können Sie in XML-Code auf Vektordrawables als
@drawableund in Java-Code alsDrawableverweisen.Mit dem folgenden Layout-XML-Code wird das Bild beispielsweise auf eine Ansicht angewendet:
<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/myimage" />
Mit dem folgenden Code wird das Bild als
Drawableabgerufen:Kotlin
val drawable = resources.getDrawable(R.drawable.myimage, theme)
Java
Resources res = getResources(); Drawable drawable = res.getDrawable(R.drawable.myimage, getTheme());
Die
getResources()-Methode befindet sich in der KlasseContext, die für UI-Objekte wie Aktivitäten, Fragmente, Layouts und Ansichten gilt.Wenn Ihre App AndroidX verwendet (auch wenn Sie keine
vectorDrawables.useSupportLibrary = true-Anweisung in Ihrerbuild.gradle-Datei haben), können Sie auch mit einerapp:srcCompat-Anweisung auf eine Vektordrawable verweisen. Beispiel:<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" app:srcCompat="@drawable/myimage" />
Gelegentlich müssen Sie die zeichenfähige Ressource in ihre genaue Klasse umwandeln, z. B. wenn Sie bestimmte Funktionen der Klasse
VectorDrawableverwenden müssen. Dazu können Sie beispielsweise den folgenden Code verwenden: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; }
Auf Vektordrawable-Ressourcen kann nur über den Hauptthread zugegriffen werden.
Für Android 5.0 (API-Level 21) und höher können Sie die Klasse AnimatedVectorDrawable verwenden, um die Attribute der Klasse VectorDrawable zu animieren. Mit AndroidX können Sie die Klasse AnimatedVectorDrawableCompat verwenden, um die Klasse VectorDrawable für Android 3.0 (API-Level 11) und höher zu animieren. Weitere Informationen finden Sie unter Zeichenbare Grafiken animieren.