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.
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)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 meinminSdkVersion
Wert kleiner als 21 ist. Gibt es eine Verhaltensänderung, wenn Sie den WertminSdkVersion
auf weniger als 21 setzen? Was ist mit dem Verschieben des XMLdrawable-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.Antworten:
Hier gibt es neue Informationen zu diesem Problem:
https://code.google.com/p/android/issues/detail?id=202019
Es sieht so aus,
android:scaleType="fitXY"
als würde es mit Lollipop korrekt skaliert.Von einem Google-Ingenieur:
quelle
Für SDK-Versionen unter 21, bei denen das Build-System Raster-Images generieren muss, und als Standardgröße, wenn Sie die Breite / Höhe nicht angeben.
Ich glaube nicht, dass dies möglich ist, wenn Sie auch SDKs unter 21 anvisieren müssen.
Dokumentation: (eigentlich nicht sehr nützlich, jetzt wo ich es wieder lese ...)
Weitere Dokumentation:
Edit: Etwas Seltsames ist los. Hier sind meine Ergebnisse im Emulator SDK Version 23 (Lollipop + Testgerät ist momentan tot ...):
Und im Emulator SDK Version 21:
quelle
width
height
viewport
height
undwidth
vonxml
?AppCompat 23.2 führt Vektor-Drawables für alle Geräte mit Android 2.1 und höher ein. Die Bilder werden unabhängig von der in der XML-Datei des Vektorzeichens angegebenen Breite / Höhe korrekt skaliert. Leider wird diese Implementierung in API Level 21 und höher nicht verwendet (zugunsten der nativen Implementierung).
Die gute Nachricht ist, dass wir AppCompat zwingen können, seine Implementierung auf den API-Ebenen 21 und 22 zu verwenden. Die schlechte Nachricht ist, dass wir Reflexion verwenden müssen, um dies zu tun.
Stellen Sie zunächst sicher, dass Sie die neueste Version von AppCompat verwenden und die neue Vektorimplementierung aktiviert haben:
Rufen
useCompatVectorIfNeeded();
Sie dann onCreate () Ihrer Anwendung auf:Stellen Sie schließlich sicher, dass Sie das Image Ihrer ImageView verwenden,
app:srcCompat
anstattandroid:src
es festzulegen:Ihre Vektorzeichnungen sollten jetzt korrekt skaliert werden!
quelle
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 verwenden, der als 24-dp-Zeichnung in einer Textansicht sowie als großes Bild in Bildschirmnähe verwendet werden kann?
3) Wie verwende ich die Attribute width / height effektiv und was ist der Unterschied zu viewportWidth / Height?
quelle
Ich löse mein Problem, ändere einfach die Größe des Vektorbildes. Von Anfang an war es eine Ressource wie:
Und ich habe es in 150dp (Größe von ImageView im Layout mit dieser Vektorressource) geändert wie:
Es funktioniert für mich.
quelle
Ich versuche es auf diese Weise, aber leider hat keiner von ihnen funktioniert. Ich versuche ,
fitXY
inImageView
, versuche ich mit ,app:srcCompat
aber kann es nicht einmal verwenden. aber ich habe einen Trick gefunden:Der Sinn dieses Weges sind jedoch die Dimensionen von Ansichten. Wenn Sie
ImageView
falsche Abmessungen haben, erhält Drawable Stretch. Sie müssen es in Pre-Lollipop-Versionen steuern oder einige Ansichten verwendenPercentRelativeLayout
.Hoffe es ist hilfreich.
quelle
Erstens : Importieren Sie svg in drawble: (( https://www.learn2crack.com/2016/02/android-studio-svg.html ))
Zweitens : Wenn Sie Unterstützung von Android API 7+ wünschen, müssen Sie die Aufzeichnung der Android Support Library verwenden (( https://stackoverflow.com/a/44713221/1140304 )).
1- hinzufügen
in Ihre build.gradle-Datei.
2-Verwenden Sie einen Namespace in Ihrem Layout mit imageView:
Drittens : Setzen Sie imageView mit android: scaleType = "fitXY" und verwenden Sie app: srcCompat
Viertens : Wenn Sie svg in Java-Code setzen möchten, müssen Sie bei oncreate methoed die folgende Zeile hinzufügen
quelle
Für mich war der Grund, warum Vektoren in png konvertiert wurden, ein
android:fillType="evenodd"
Attribut in meinem Vektor, das gezeichnet werden konnte. Als ich alle Vorkommen dieses Attributs in meinem Drawable entfernte (daher der Standardfüllungstypnonzero
, der auf den Vektor angewendet wurde), war beim nächsten Erstellen der App alles in Ordnung.quelle