2015-12-08 2 views
71

Wenn Sie den Vektor-Asset-Assistenten in Android Studio 1.5.0 verwenden, jeden Vektor ziehbar XML importieren Sie diese Assistenten in res/drawable/ geht.Was ist der Unterschied zwischen -anydpi und -nodpi?

Das Verzeichnis build/ und die resultierende APK zeigen jedoch, dass diese XML-Dateien in ein res/drawable-anydpi-v21/ Ressourcenverzeichnis verschoben werden. Der -v21 Teil ist sinnvoll, da VectorDrawable nur auf API Level 21+ unterstützt wird. -anydpi scheint jedoch undokumentiert zu sein. Ich hätte erwartet, sowohl für das ursprüngliche Importziel als auch dafür, wo das Build-System wählt, es zu verschieben.

Hat jemand offizielle Aussagen für was -anydpi bedeutet, und was ist seine Beziehung mit -nodpi? Ich suche nach praktischen Effekten, nicht nur was einige Code-Kommentare andeuten.

+0

[Lesen Sie die OP-eigene Zusammenfassung hier.] (Https://commonsware.com/blog/2015/12/21/nodpi-anydpi-wtf.html) – Suragch

Antwort

63

nodpi

Diese sind dichteunabhängige Ressourcen. Das System skaliert Ressourcen, die mit diesem Qualifikationsmerkmal versehen sind, unabhängig von der aktuellen Bildschirmdichte nicht.

Zum Beispiel:

  • drawable- nodpi /dot.png

Der Punkt wird auf xxhdpi, groß auf LDPI klein erscheinen.

Allerdings wird die Ressource Resolver ein bestimmtes Qualifikationsspiel übereinstimmen, wenn es vorhanden ist.

Zum Beispiel

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

Auf einem Lutscher (API 21) hdpi Vorrichtung wird die Bitmap verwendet.

Auf einem Lutscher (API 21) xhdpi Vorrichtung wird der Vektor verwendet.

anydpi

Diese Ressourcen haben Vorrang in jeder dpi.

Zum Beispiel

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

Auf einem Lutscher (API 21) hdpi Vorrichtung das Vektor verwendet.

Auf einem Lutscher (API 21) xhdpi Vorrichtung wird der Vektor verwendet.

erste Reaktion

Unten ist das, was ich ursprünglich aus der Änderung Beschreibung verstanden, aber das ist nicht, wie mein Gerät verhält. Dies könnte für ältere SDK-Tools korrekt sein.

nodpi

nicht wie beabsichtigt arbeiten: Jedoch nodpi Vorrang nicht statt. Zum Beispiel, wenn Sie

  • drawable- MDPI /eg.png
  • drawable- hdpi /eg.png
  • drawable- nodpi /eg.xml
haben

Dann

  • Ein ein mdpi, wird das Framework die mdpi Bitmap nehmen.
  • Auf einem xxxdpi nimmt das Framework die hdpi Bitmap.

Behelfslösung für Vektor Drawables: Wenn Sie einen Vektor ziehbar verwenden möchten, dann Sie Schiff haben:

  • drawable- MDPI /eg.png
  • drawable- MDPI /eg.xml
  • drawable- hdpi /eg.png
  • drawable- hdpi /eg.xml

anydpi

Added mit change Ic3288d0236fe0bff20bb1599aba2582c25b0db32 der "anydpi" resource Qualifier vom Framework nicht anders gefunden wird, wenn eine exakte dpi ausgewählt ist.

Dies ist riesig für alle, die Vektor-Drawables verwenden.

Nun, wenn Sie

  • drawable- MDPI /eg.png
  • drawable- hdpi/eg haben.png
  • drawable- anydpi /eg.xml

Dann

  • Auf einem MDPI, nimmt der Rahmen die MDPI Bitmap.
  • Auf einem xxxdpi nimmt das Framework den Vektor.
+0

Das sehe ich nicht. Zitieren mein Kopfgeld: "Angesichts zwei Editionen der gleichen Ressource in Res/Drawable-Nodpi/und Res-Drawable-MDpi /, bekomme ich die Res/Drawable-Nodpi/Edition auf einem Nexus 5 mit Android 6.0, die ein-xxhdpi ist Gerät". Haben Sie ein Beispielprojekt, das das von Ihnen zitierte Verhalten zeigt? – CommonsWare

+0

Das liegt daran, dass Sie 'drawable' verwendet haben. Die Funktionsweise des SDK kann sich geändert haben. Siehe [VectorDrawable: Android lädt xhdpi-PNGs anstelle der Vektorressource] (http://stackoverflow.com/questions/290/vectordrawable-android-loads-xhdpi-pngs-instead-of-the-vector-resource/32271246#32271246) – rds

+0

"Das ist, weil Sie zeichnend verwendet" - so haben Sie in Ihrer Antwort. Jedes einzelne Ressourcenverzeichnis, das du in deiner Antwort zitierst, ist ein "ziehbares" Ressourcenverzeichnis, genauso wie die beiden Verzeichnisse, die ich in meinem Bounty zitiert habe, "zeichnende" Ressourcenverzeichnisse sind. – CommonsWare

13

Die source code enthält die folgenden Kommentare (Linie 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; 

Hoffnung dies die Verwirrung löscht.

+5

"Hoffe das klärt die Verwirrung "- nicht wirklich. Es ist unklar, was der Unterschied zwischen "Skalierung zu irgendeiner Dichte" und "nicht zur Skalierung" in der Praxis bedeutet. Drawables in '-nodpi'-Verzeichnissen werden auf der Basis der Größe skaliert, je nachdem, welche Regeln für die Verwendung des Zeichensatzes gelten. – CommonsWare

+0

"Nicht zur Skalierung gedacht" bedeutet, dass sie nicht skaliert werden, egal, welcher Programmierer welche Dichte hat. –

+0

Ich denke, dass sie mit dem Ausdruck "Maßstab zu jeder Dichte" meinen, dass sie sich auf Vektor-Drawables beziehen, die ** auf jede Dichte skaliert werden, egal wie groß die Dichte ist. –

4

nodpi: Ressourcen für alle Dichten. Dies sind dichteunabhängige Ressourcen. Das System skaliert Ressourcen, die mit diesem Qualifikationsmerkmal versehen sind, unabhängig von der aktuellen Bildschirmdichte nicht.

anydpi: Dieser Qualifizierer stimmt mit allen Bildschirmdichten überein und hat Vorrang vor anderen Qualifizierern. Dies ist nützlich für Vektor-Zeichen. Hinzugefügt in API Level 21.

Verwandte Themen