Qual è la differenza tra -anydpi e -nodpi?


108

Se utilizzi la procedura guidata Asset vettoriali in Android Studio 1.5.0, qualsiasi XML disegnabile vettoriale importato utilizzando quella procedura guidata entra in res/drawable/.

Tuttavia, la build/directory e l'APK risultante mostrano che quei file XML vengono spostati in una res/drawable-anydpi-v21/directory di risorse. La -v21parte ha senso, poiché VectorDrawableè supportata solo su API Level 21+. Tuttavia, -anydpisembra non essere documentato. Me lo sarei aspettato -nodpi, sia per la destinazione di importazione originale che per dove il sistema di compilazione sceglie di spostarlo.

Qualcuno ha visto dichiarazioni ufficiali per quali -anydpimezzi e con quali rapporti -nodpi? Sto cercando effetti pratici, non solo ciò a cui suggeriscono alcuni commenti sul codice.


Risposte:


106

nodpi

Queste sono risorse indipendenti dalla densità. Il sistema non scala le risorse contrassegnate con questo qualificatore, indipendentemente dalla densità dello schermo corrente.

Per esempio:

  • drawable- nodpi /dot.png

Il punto apparirà piccolo su xxhdpi, grande su ldpi.

Tuttavia, il risolutore di risorse corrisponderà a un qualificatore specifico, se esistente.

Per esempio

  • drawable- hdpi /eg.png
  • drawable- nodpi -v21 / eg.xml

Su un dispositivo hdpi Lollipop (API 21), viene utilizzata la bitmap .

Su un dispositivo xhdpi Lollipop (API 21), viene utilizzato il vettore.

anydpi

Queste risorse hanno la precedenza in qualsiasi dpi.

Per esempio

  • drawable- hdpi /eg.png
  • drawable- anydpi -v21 / eg.xml

Su un dispositivo hdpi Lollipop (API 21), viene utilizzato il vettore .

Su un dispositivo xhdpi Lollipop (API 21), viene utilizzato il vettore.

Riferimento

Nota : anydpi è stato aggiunto nella modifica Ic3288d0236fe0bff20bb1599aba2582c25b0db32 .


Non è quello che vedo. Citando la mia taglia: "Date due edizioni della stessa risorsa in res / drawable-nodpi / e res-drawable-mdpi /, ottengo l'edizione res / drawable-nodpi / su un Nexus 5 con Android 6.0, che è un -xxhdpi dispositivo". Hai un progetto di esempio che dimostra il comportamento che stai citando?
CommonsWare

Questo perché hai usato drawable. Il comportamento dell'SDK può essere cambiato. Vedi VectorDrawable: Android carica i PNG xhdpi invece della risorsa vettoriale
rds

"Questo perché hai usato drawable" - così hai fatto nella tua risposta. Ogni singola directory di risorse che citi nella tua risposta è una drawabledirectory di risorse, proprio come entrambe le directory che ho citato nel mio bounty sono drawabledirectory di risorse.
CommonsWare

"Su un xxxdpi, il framework prenderà la bitmap hdpi." - questo è specificamente ciò che non sta accadendo, sebbene il mio test sia su un -xxhdpidispositivo. Ho res/drawable-mdpi/nodpi_and_m.pnge res/drawable-nodpi/nodpi_and_m.xml. Su un -xxhdpidispositivo Nexus 5, la risorsa utilizzata è res/drawable-nodpi/nodpi_and_m.xml. Secondo il tuo algoritmo e le mie aspettative, res/drawable-mdpi/nodpi_and_m.pngdovrebbe essere utilizzato. Non è quello che sta succedendo.
CommonsWare

2
In conclusione: dovresti inserire i vettori in drawable-anydpi-v21. Se disponi della libreria support-vector-drawable, puoi inserirli in drawable-anydpio semplicemente drawable.
rds

17

Il codice sorgente contiene i seguenti commenti (riga 639):

/**
 * Value for {@link #densityDpi} for resources that scale to any density (vector drawables).
 * {@hide}
 */
public static final int DENSITY_DPI_ANY = 0xfffe;

/**
 * Value for {@link #densityDpi} for resources that are not meant to be scaled.
 * {@hide}
 */
public static final int DENSITY_DPI_NONE = 0xffff;

Spero che questo cancelli la confusione.


8
"Spero che questo cancelli la confusione" - non proprio. Non è chiaro quale sia la differenza tra "scala a qualsiasi densità" e "non destinato ad essere ridimensionato" nella pratica. I drawable nelle -nodpidirectory vengono sicuramente ridimensionati in base alla dimensione, in base alle regole in vigore su come viene utilizzato il drawable.
CommonsWare

"Non destinati a ridimensionarsi" significa che non verranno ridimensionati, indipendentemente da cosa fa il programmatore o quale sia la densità.
Vishavjeet Singh

Penso che intendano con la frase "scala a qualsiasi densità" che si riferiscono a disegnabili vettoriali che scaleranno per adattarsi a qualsiasi densità, non importa quanto grande sia la densità.
Vishavjeet Singh

3
è stato aggiunto in android.googlesource.com/platform/frameworks/base/+/31245b4%5E! , e da esso puoi imparare che probabilmente ha risolto qualche bug 17007265
marcinj

1
@ MarcinJędrzejewski: In realtà, il commento "sono scelti come la migliore corrispondenza a meno che non ci sia una configurazione che corrisponde esattamente alla densità richiesta" il commento su quel commit mi dà un indizio. Grazie!
CommonsWare

10

nodpi: Risorse per tutte le densità. Queste sono risorse indipendenti dalla densità. Il sistema non scala le risorse contrassegnate con questo qualificatore, indipendentemente dalla densità dello schermo corrente.

anydpi: Questo qualificatore corrisponde a tutte le densità dello schermo e ha la precedenza sugli altri qualificatori. Questo è utile per i disegni vettoriali. Aggiunto nel livello API 21.


9

Uso drawable-nodpi per tutto, inclusa molta grafica di grandi dimensioni per il mio gioco. Una conseguenza non documentata del ridimensionamento della grafica è che aumenta in modo esponenziale l'utilizzo della memoria. Quindi, se hai un grafico da 1 MB disegnabile, verrà ridimensionato a 4 MB, 16 MB o 64 MB a seconda della risoluzione del dispositivo dell'utente. E le risoluzioni dei dispositivi continuano a salire. Questo aumento di scala in realtà non aumenta la nitidezza della grafica, ovviamente. Le azioni di disegno possono comunque stabilire la dimensione di ciascuna grafica in relazione alle dimensioni dello schermo, non è necessario gonfiare l'app con più cartelle di disegno.


3
risposta sottovalutata. Ho riscontrato lo stesso problema: avevo un'immagine grande 100 KB, ma spesso presentavo errori OOM durante il caricamento. L'app si è bloccata affermando che non poteva allocare 18 MB !!! Non riuscivo a capire come questi 100 KB potessero essere trasformati in 18 MB, ma in realtà era il risultato di quel ridimensionamento. Il passaggio dell'immagine a nessun dpi ha risolto il problema.
Simon Ninon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.