Sto tentando di utilizzare i disegnabili vettoriali nella mia app Android. Da http://developer.android.com/training/material/drawables.html (enfasi mia):
In Android 5.0 (livello API 21) e versioni successive, è possibile definire i disegnabili vettoriali, che scalano senza perdere la definizione.
Usando questo disegnabile:
<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" />
e questo ImageView:
<ImageView
android:layout_width="400dp"
android:layout_height="400dp"
android:src="@drawable/icon_bell"/>
produce questa immagine sfocata quando si tenta di visualizzare l'icona a 400 dpi (su un dispositivo mobile ad alta risoluzione di circa 2015 che esegue lecca-lecca):
Modificare la larghezza e l'altezza nella definizione del vettore disegnabile a 200dp migliora significativamente la situazione alla dimensione renderizzata di 400dp. Tuttavia, impostandolo come disegnabile per un elemento TextView (cioè un'icona a sinistra del testo) ora crea un'icona enorme.
Le mie domande:
1) Perché c'è una specifica di larghezza / altezza nel disegno vettoriale? Ho pensato che il punto centrale di questi è che si scalano su e giù senza perdite rendendo la larghezza e l'altezza prive di significato nella sua definizione?
2) È possibile utilizzare un singolo disegnabile vettoriale che funziona come un disegnabile 24dp su TextView ma si ridimensiona bene per utilizzare anche immagini molto più grandi? Ad esempio, come posso evitare di creare più drawable vettoriali di dimensioni diverse e invece utilizzarne uno che si adatta alle mie esigenze di rendering?
3) Come faccio a utilizzare efficacemente gli attributi larghezza / altezza e qual è la differenza con viewportWidth / Height?
Dettagli aggiuntivi:
- Il dispositivo esegue l'API 22
- Utilizzo di Android Studio v1.5.1 con Gradle versione 1.5.0
- Manifest è compilato e target livello 23, livello minimo 15. Ho anche provato a spostare il livello minimo a 21, ma questo non ha fatto differenza.
- La decompilazione dell'APK (con il livello minimo impostato su 21) mostra una singola risorsa XML nella cartella disegnabile. Non vengono prodotte immagini rasterizzate.
drawable
cartella. La larghezza / altezza nel file xml disegnabile vettoriale è 24dp. Specificare un ImageView di 400dp di altezza / larghezza sta sicuramente creando un'immagine scarsamente ridimensionata.
drawable-anydpi-v21
è perché il mio minSdkVersion
è inferiore a 21. Qualche cambiamento nel comportamento se imposti il minSdkVersion
a meno di 21? Che ne dici di spostare l'XML in drawable-anydpi
? Non mi aspetto che ci sia un cambiamento, ma mi aspetto anche che la tua immagine vettoriale venga ridimensionata correttamente ...
drawable-anydpi-v21
con varie immagini rasterizzate in mdi / hdpi / ecc. cartelle. Nessuna modifica al risultato finale reso però.
New -> Vector Asset
, rilascia l'XML dell'immagine vettoriale nella mia cartella disegnabile. Tuttavia, se utilizzo apktool per decomprimere l'APK che viene creato, vedo che i file XML sono presentidrawable-anydpi-v21
e scalano correttamente sui dispositivi API 21+. I file raster vengono inseriti nelledrawable-<mdpi/hdpi/etc>-v4
cartelle e non utilizzati su dispositivi API 21+ (in base al fatto che vengono ridimensionati correttamente)