Ich versuche, Vektor-Drawables in meiner Android-App zu verwenden. Von http://developer.android.com/training/material/drawables.html (Schwerpunkt Mine):
In Android 5.0 (API Level 21) und höher können Sie Vektorzeichnungen definieren, die skalieren, ohne die Definition zu verlieren.
Verwenden dieses Zeichens:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@color/colorPrimary" android:pathData="M14,20A2,2 0 0,1 12,22A2,2 0 0,1 10,20H14M12,2A1,1 0 0,1 13,3V4.08C15.84,4.56 18,7.03 18,10V16L21,19H3L6,16V10C6,7.03 8.16,4.56 11,4.08V3A1,1 0 0,1 12,2Z" />
und diese ImageView:
<ImageView
android:layout_width="400dp"
android:layout_height="400dp"
android:src="@drawable/icon_bell"/>
erzeugt dieses verschwommene Bild, wenn versucht wird, das Symbol mit 400 dp anzuzeigen (auf einem großen hochauflösenden Mobilgerät von ca. 2015 mit Lollipop):
Durch Ändern der Breite und Höhe in der Definition des zu zeichnenden Vektors auf 200 dp wird die Situation bei der gerenderten Größe von 400 dp erheblich verbessert. Wenn Sie dies jedoch als Zeichen für ein TextView-Element festlegen (dh ein Symbol links neben dem Text), wird jetzt ein großes Symbol erstellt.
Meine Fragen:
1) Warum gibt es im Vektor eine Breite / Höhe-Spezifikation? Ich dachte, der springende Punkt dabei ist, dass sie verlustfrei auf und ab skalieren, wodurch Breite und Höhe in ihrer Definition bedeutungslos werden.
2) Ist es möglich, einen einzelnen Vektor zu zeichnen, der als 24-dp-Zeichen in einer Textansicht funktioniert, sich aber gut skalieren lässt, um auch so viel größere Bilder zu verwenden? Wie vermeide ich beispielsweise das Erstellen mehrerer Vektorzeichnungen in verschiedenen Größen und verwende stattdessen eine, die meinen gerenderten Anforderungen entspricht?
3) Wie verwende ich die Attribute width / height effektiv und was ist der Unterschied zu viewportWidth / Height?
Weitere Details:
- Auf dem Gerät wird API 22 ausgeführt
- Verwenden von Android Studio v1.5.1 mit Gradle Version 1.5.0
- Manifest ist Kompilieren und Ziellevel 23, Min Level 15. Ich habe auch versucht, Min Level auf 21 zu verschieben, aber das machte keinen Unterschied.
- Beim Dekompilieren der APK (mit der Mindeststufe 21) wird eine einzelne XML-Ressource im Zeichenordner angezeigt. Es werden keine gerasterten Bilder erzeugt.
drawable
Ordner der einzige Ort, an dem das Bild in der APK angezeigt wird . Die Breite / Höhe in der vom Vektor zeichnbaren XML-Datei beträgt 24 dp. Wenn Sie eine ImageView mit einer Höhe / Breite von 400 dp angeben, wird definitiv ein schlecht skaliertes Bild erstellt.
drawable-anydpi-v21
ist, dass mein minSdkVersion
Wert kleiner als 21 ist. Gibt es eine Verhaltensänderung, wenn Sie den Wert minSdkVersion
auf weniger als 21 setzen? Was ist mit dem Verschieben des XML drawable-anydpi
? Ich würde nicht erwarten, dass sich etwas ändert, aber ich würde auch erwarten, dass Ihr Vektorbild korrekt skaliert wird ...
drawable-anydpi-v21
mit verschiedenen gerasterten Bildern in mdi / hdpi / etc. Ordner. Keine Änderung des gerenderten Endergebnisses.
New -> Vector Asset
, wird das Vektorbild-XML in meinem Zeichenordner abgelegt. Wenn ich jedoch apktool verwende, um das zu erstellende APK zu entpacken, sehe ich, dass die XML-Dateiendrawable-anydpi-v21
auf API 21+ -Geräten vorhanden sind und korrekt skaliert werden. Die Rasterdateien werden in dendrawable-<mdpi/hdpi/etc>-v4
Ordnern abgelegt und nicht auf API 21+ -Geräten verwendet (basierend auf der Tatsache, dass sie korrekt skaliert werden)