Mipmap Drawables für Icons

449

Seit Android 4.3 (Jelly Bean) können wir jetzt die res/mipmapOrdner zum Speichern von "Mipmap" -Bildern verwenden.

Beispielsweise speichert Chrome für Android seine Symbole in diesen Ordnern anstelle der normaleren res/drawableOrdner.

Wie unterscheiden sich diese Mipmap-Bilder von den anderen bekannten zeichnbaren Bildern?

Ich sehe, dass wir in meinem Manifest @mipmap/stattdessen das Qualifikationsmerkmal verwenden @drawable/, was angesichts des Namens des Ressourcenordners sinnvoll ist:

<activity
    android:name=".MipmapDemp"
    android:icon="@mipmap/ic_launcher" />

Verweise:

Das Android 4.3 APIs- Dokument enthält Folgendes:

Die Verwendung einer Mipmap als Quelle für Ihre Bitmap oder zum Zeichnen ist eine einfache Möglichkeit, ein qualitativ hochwertiges Bild und verschiedene Bildskalen bereitzustellen. Dies kann besonders nützlich sein, wenn Sie erwarten, dass Ihr Bild während einer Animation skaliert wird.

Android 4.2 (API-Stufe 17) hat die Unterstützung für Mipmaps in der Bitmap-Klasse hinzugefügt. Android tauscht die Mip-Bilder in Ihrer Bitmap aus, wenn Sie eine Mipmap-Quelle angegeben und setHasMipMap () aktiviert haben. In Android 4.3 können Sie jetzt auch Mipmaps für ein BitmapDrawable-Objekt aktivieren, indem Sie ein Mipmap-Asset bereitstellen und das Attribut android: mipMap in einer Bitmap-Ressourcendatei festlegen oder hasMipMap () aufrufen.

Ich sehe dort nichts, was mir hilft zu verstehen.


XML-Bitmap-Ressourcen haben eine android:mipMapEigenschaft:

Boolescher Wert. Aktiviert oder deaktiviert den Mipmap-Hinweis. Weitere Informationen finden Sie unter setHasMipMap (). Der Standardwert ist false.

Dies gilt meines Erachtens nicht für Startsymbole.


Die Frage wurde in Google Groups gestellt ( Der Zweck des Ressourcennamens "mipmap"?! ), Worauf Romain Guy antwortete:

Es ist nützlich, ein Bild mit einer größeren Auflösung bereitzustellen, die normalerweise berechnet wird (auf einem mdpi-Gerät möchte Launcher beispielsweise, dass das größere hdpi-Symbol große App-Verknüpfungen anzeigt.)

Ich denke, das macht fast Sinn, aber nicht ganz.

Ich bin immer noch geneigt, Randy Sugiantos Follow-up zu folgen:

Was sind die Vorteile davon? Gibt es eine Anleitung zur Verwendung von Mipmaps, wahrscheinlich für bessere Startsymbole?


Natürlich hat Wikipedia eine Seite für "Mipmap" , die sich auf eine ältere Technik bezieht, die 1983 erfunden wurde und die ich nicht ganz mit der aktuellen Android-Implementierung in Verbindung bringen kann.


Sollten wir heutzutage alle unsere App-Symbole in res/mipmapOrdnern speichern und welche Richtlinien gelten für diese Mipmap-Bilder?


Update Nr. 1

Hier ist ein Blog-Beitrag, der versucht, es ein wenig zu erklären.

Das in diesem Blogbeitrag verwendete Bild zeigt jedoch, wie eine Datei mit vielen Logos aussieht. Dies ist nicht das, was ich im Mipmap-Ordner von Chrome sehe.

Der Chrome- mipmap-hdpiOrdner enthält drei Bilder. Eines ist das Chrome-Logo für sich.

Chrome mipmap-hdpi icon.png

Seltsamerweise ist es 72x72, nicht 48x48, was ich erwarten würde.

Vielleicht ist das alles, was dazu gehört - wir müssen nur größere Symbole in den Mipmap-Ordnern behalten?


Update Nr. 2

Der Android Developers Blog-Beitrag vom 23.10.2014 bestätigt erneut die Idee, die mipmapOrdner für Anwendungssymbole zu verwenden:

Wenn der Autor über die Bildschirmdichte des Nexus 6 spricht, schreibt er:

Es wird empfohlen, Ihre App-Symbole in Mipmap-Ordnern (nicht in den Zeichenordnern) zu platzieren, da sie mit anderen Auflösungen als der aktuellen Dichte des Geräts verwendet werden. Beispielsweise kann ein xxxhdpi-App-Symbol auf dem Launcher für ein xxhdpi-Gerät verwendet werden.


Update Nr. 3

Beachten Sie, dass Android Studio die ic_launcher.pngSymbole in den mipmap...Ordnern erstellt und nicht die drawable...Ordner, in denen Eclipse sie erstellt hat.


Richard Le Mesurier
quelle

Antworten:

260

Es gibt zwei verschiedene Verwendungszwecke von Mipmaps:

  1. Für Startsymbole beim Erstellen dichtespezifischer APKs. Einige Entwickler erstellen separate APKs für jede Dichte, um die APK-Größe niedrig zu halten. Einige Starter (mit einigen Geräten ausgeliefert oder im Play Store erhältlich) verwenden jedoch größere Symbolgrößen als die Standard-48dp. Starter verwenden getDrawableForDensity und skalieren bei Bedarf nach unten und nicht nach oben, sodass die Symbole von hoher Qualität sind. Beispielsweise kann der Launcher auf einem HDPI-Tablet das xhdpi-Symbol laden. Wenn Sie Ihr Startsymbol im Verzeichnis mipmap-xhdpi platzieren, wird es beim Erstellen einer APK für HDPI-Geräte nicht so entfernt wie ein Verzeichnis drawable-xhdpi. Wenn Sie eine einzige APK für alle Geräte erstellen, spielt dies keine Rolle, da der Launcher auf die zeichnbaren Ressourcen für die gewünschte Dichte zugreifen kann.

  2. Die eigentliche Mipmap-API aus 4.3. Ich habe das nicht benutzt und bin damit nicht vertraut. Es wird von den Android Open Source Project-Startern nicht verwendet, und mir ist kein anderer Launcher bekannt.

Kevin TeslaCoil
quelle
2
Sie schlagen also ein Build-Skript vor, das die falschen Dichteordner für alle außer den Mipmap-Ressourcen entfernt, wenn ich das richtig verstehe?
Richard Le Mesurier
20
Ich würde vorschlagen, nur eine APK für alle Dichten zu erstellen und sich darüber keine Sorgen zu machen. Aber ja, der Grund, warum Mipmap-Verzeichnisse manchmal für Launcher-Symbole verwendet werden, liegt darin, dass Build-Skripte (aapt - Preferred-Configurations) Drawable- {Density} -Verzeichnisse entfernen, aber keine Mipmap- {Density} -Verzeichnisse. Es scheint fast so, als würde man einen Fehler ausnutzen, aber Ihr Zitat aus dem Beitrag von Romain Guy und Diane Hackborn unter plus.google.com/105051985738280261832/posts/QTA9McYan1L zeigt, dass es beabsichtigt ist.
Kevin TeslaCoil
3
Daher ist mein typischer Prozess, Mipmap zu löschen, meine Symbole in Drawables zu platzieren und eine einzelne APK zu erstellen, perfekt. Es klingt so, als ob Mipmap für die meisten von uns Entwicklern untypisch ist, aber es wird uns allen aufgezwungen.
Jemand irgendwo
In der Dokumentation heißt es: "mipmap: Zeichnungsdateien für verschiedene Launcher-Symboldichten." developer.android.com/guide/topics/resources/…
Aktivität
79

Es scheint, dass Google seine Dokumente seit all diesen Antworten aktualisiert hat. Hoffentlich hilft dies in Zukunft jemand anderem :) Ich bin gerade auf diese Frage gestoßen, als ich ein neues (neues) Projekt erstellt habe.

TL; DR: Drawables können im Rahmen der dp-spezifischen Ressourcenoptimierung entfernt werden. Mipmaps werden nicht entfernt.

Verschiedene Startbildschirm-Starter-Apps auf verschiedenen Geräten zeigen App-Starter-Symbole in verschiedenen Auflösungen an. Wenn Techniken zur Optimierung von App-Ressourcen Ressourcen für nicht verwendete Bildschirmdichten entfernen, werden Startsymbole möglicherweise unscharf, da die Start-App ein Symbol mit niedrigerer Auflösung für die Anzeige hochskalieren muss. Um diese Anzeigeprobleme zu vermeiden, sollten Apps die mipmap/Ressourcenordner für Startsymbole verwenden. Das Android-System bewahrt diese Ressourcen unabhängig vom Dichte-Stripping und stellt sicher, dass Launcher-Apps Symbole mit der besten Auflösung für die Anzeige auswählen können.

(von http://developer.android.com/tools/projects/index.html#mipmap )

Kazuaki
quelle
2
Dies steht im Einklang mit der Standardplatzierung von Android Studio beim Importieren von Bildelementen. Launcher-Symbole werden in die Mipmap eingefügt. andere gehen in zeichnbar.
Edward Brey
2
Die Dokumentation scheint sich wieder geändert zu haben, mipmap scheint nicht in developer.android.com/tools/projects/index.html zu existieren (obwohl andere Teile der Android-Dokumentation immer noch versuchen, darauf zu verweisen).
Jemand anderes
28

Wie unterscheiden sich diese Mipmap-Bilder von den anderen bekannten zeichnbaren Bildern?

Hier sind meine zwei Cent, um den Unterschied zu erklären. Es gibt zwei Fälle, mit denen Sie sich bei der Arbeit mit Bildern in Android befassen:

  1. Sie möchten ein Bild für Ihre Gerätedichte laden und es "wie es ist" verwenden, ohne die tatsächliche Größe zu ändern . In diesem Fall sollten Sie mit Drawables arbeiten und Android liefert Ihnen das am besten passende Bild.

  2. Sie möchten ein Bild für Ihre Gerätedichte laden, dieses Bild wird jedoch vergrößert oder verkleinert . Dies ist beispielsweise erforderlich, wenn Sie ein größeres Startsymbol anzeigen möchten oder wenn Sie eine Animation haben, die die Bildgröße erhöht. In solchen Fällen sollten Sie Ihr Bild in einen Mipmap- Ordner legen, um die beste Bildqualität zu gewährleisten . Android versucht, das Bild aus einem Bucket mit höherer Dichte aufzunehmen, anstatt es zu vergrößern. Dies erhöht die Schärfe (Qualität) des Bildes.

Die Faustregel für die Entscheidung, wo Ihr Bild abgelegt werden soll, lautet daher:

  • Launcher-Symbole werden immer in den Mipmap- Ordner verschoben .
  • Bilder, die häufig vergrößert (oder extrem verkleinert) werden und deren Qualität für die App von entscheidender Bedeutung ist, werden ebenfalls in den Ordner mipmap verschoben .
  • Alle anderen Bilder sind übliche Zeichen .
sergej shafarenka
quelle
Also gehen die Symbole für die Aktionsleiste oder das Symbol für die schwebende Schaltfläche in die Mipmap?
Juan De la Cruz
Nein, sie sind übliche Drawables.
Sergej Shafarenka
23

Die Android-Implementierung von Mipmaps in 4.3 ist genau die Technik aus dem Jahr 1983, die im Wikipedia-Artikel erklärt wurde :)

Jedes Bitmap-Bild des Mipmap-Sets ist ein verkleinertes Duplikat der Haupttextur, jedoch mit einem bestimmten reduzierten Detaillierungsgrad. Obwohl die Haupttextur immer noch verwendet wird, wenn die Ansicht ausreicht, um sie vollständig zu rendern, wechselt der Renderer zu einem geeigneten Mipmap-Bild (...), wenn die Textur aus der Ferne oder in geringer Größe betrachtet wird.

Obwohl dies als eine Technik für 3D-Grafiken beschrieben wird (da "aus der Ferne betrachtet" erwähnt wird), gilt dies auch für 2D (übersetzt als "gezeichnet ist ein kleinerer Raum", dh "verkleinert").

Stellen Sie sich für ein konkretes Android-Beispiel vor, Sie hätten eine Ansicht mit einem bestimmten Hintergrund, der gezeichnet werden kann (insbesondere a BitmapDrawable). Sie verwenden jetzt eine Animation, um sie auf 0,15 ihrer ursprünglichen Größe zu skalieren. Normalerweise würde dies das Herunterskalieren der Hintergrundbitmap für jeden Frame erfordern. Diese "extreme" Verkleinerung kann jedoch zu visuellen Artefakten führen.

Sie können jedoch eine Mipmap bereitstellen. Dies bedeutet, dass das Bild bereits für einige bestimmte Maßstäbe vorgerendert wurde (z. B. 1,0, 0,5 und 0,25). Wenn die Animation den Schwellenwert von 0,5 "überschreitet", anstatt das ursprüngliche Bild mit der Größe 1,0 weiter zu verkleinern, wechselt sie zum Bild mit 0,5 und verkleinert es, was zu einem besseren Ergebnis führen sollte. Und so weiter, während die Animation fortgesetzt wird.

Dies ist ein bisschen theoretisch, da es tatsächlich vom Renderer gemacht wird. Laut der Quelle der Bitmap-Klasse ist dies nur ein Hinweis, und der Renderer kann ihn berücksichtigen oder auch nicht.

/**
 * Set a hint for the renderer responsible for drawing this bitmap
 * indicating that it should attempt to use mipmaps when this bitmap
 * is drawn scaled down.
 *
 * If you know that you are going to draw this bitmap at less than
 * 50% of its original size, you may be able to obtain a higher
 * quality by turning this property on.
 * 
 * Note that if the renderer respects this hint it might have to
 * allocate extra memory to hold the mipmap levels for this bitmap.
 *
 * This property is only a suggestion that can be ignored by the
 * renderer. It is not guaranteed to have any effect.
 *
 * @param hasMipMap indicates whether the renderer should attempt
 *                  to use mipmaps
 *
 * @see #hasMipMap()
 */
public final void setHasMipMap(boolean hasMipMap) {
    nativeSetHasMipMap(mNativeBitmap, hasMipMap);
}

Ich bin mir nicht ganz sicher, warum dies besonders für Anwendungssymbole geeignet ist. Obwohl Android auf Tablets sowie einige Starter (z. B. GEL) ein Symbol "eine Dichte höher" anfordern, um es größer anzuzeigen, sollte dies mithilfe des regulären Mechanismus (z. B. drawable-xxxhdpi& c) erfolgen.

Matiash
quelle
Dies erklärt nicht wirklich den Unterschied zu den drawableOrdnern, die auch Mipmapped-Bilder enthalten.
Timmmm
2
In der Tat ist diese Antwort einfach falsch. Der einzige Unterschied besteht darin, ob die Dateien entfernt werden oder nicht - dies hat nichts damit zu tun, ob Mipmapping verwendet wird oder nicht (in beiden Fällen). Der Ordner hat einen schlechten Namen. sie hätten es wahrscheinlich nennen sollen drawable-nostripoder so.
Timmmm
2
Schöne Erklärung von Mipmaps, aber die Antwort von Kazuaki auf einen Google-Dokumenteintrag scheint zu implizieren, dass dies eigentlich nicht der Grund ist.
Trilarion
11

Eine Sache, die ich in einem anderen Thread erwähnt habe, ist erwähnenswert: Wenn Sie verschiedene Versionen Ihrer App für unterschiedliche Dichten erstellen, sollten Sie das Ressourcenverzeichnis "mipmap" kennen. Dies ist genau wie bei "zeichnbaren" Ressourcen, außer dass es beim Erstellen der verschiedenen apk-Ziele nicht am Dichtestreifen teilnimmt.

https://plus.google.com/105051985738280261832/posts/QTA9McYan1L

Kreker
quelle
... ja in der Tat, wie von Kevin in der akzeptierten Antwort erwähnt. Dies scheint der Hauptgrund dafür gewesen zu sein.
Richard Le Mesurier
@ RichardLeMesurier ja, nur um es kurz und klar zu machen
Kreker
4

Da ich nach einer klarstellenden Antwort darauf gesucht habe, um den richtigen Typ für Benachrichtigungssymbole zu bestimmen, möchte ich diese klare Aussage zum Thema hinzufügen. Es ist von http://developer.android.com/tools/help/image-asset-studio.html#saving

Hinweis: Launcher-Symboldateien befinden sich an einem anderen Speicherort als andere Symbole. Sie befinden sich im Ordner mipmap /. Alle anderen Symboldateien befinden sich im Zeichen- / Ordner Ihres Projekts.

Stev
quelle
2

Wenn Sie separate Apks für unterschiedliche Dichten erstellen, werden Zeichenordner für andere Dichten entfernt. Dadurch werden die Symbole auf Geräten, die Startsymbole mit höherer Dichte verwenden, verschwommen. Da Mipmap-Ordner nicht entfernt werden, ist es immer am besten, sie zum Einfügen der Startsymbole zu verwenden.

Fartab
quelle
2

Es gibt zwei Fälle, mit denen Sie sich bei der Arbeit mit Bildern in Android befassen:

  1. Sie möchten ein Bild für Ihre Gerätedichte laden und verwenden es "wie es ist", ohne die tatsächliche Größe zu ändern. In diesem Fall sollten Sie mit Drawables arbeiten und Android liefert Ihnen das am besten passende Bild.
  2. Sie möchten ein Bild für Ihre Gerätedichte laden, dieses Bild wird jedoch vergrößert oder verkleinert. Dies ist beispielsweise erforderlich, wenn Sie ein größeres Startsymbol anzeigen möchten oder wenn Sie eine Animation haben, die die Bildgröße erhöht. In solchen Fällen sollten Sie Ihr Bild in einen Mipmap-Ordner legen, um die beste Bildqualität zu gewährleisten. Android versucht, das Bild aus einem Bucket mit höherer Dichte aufzunehmen, anstatt es zu vergrößern.

DAMIT

Die Faustregel für die Entscheidung, wo Ihr Bild abgelegt werden soll, lautet daher:

  1. Launcher-Symbole werden immer in den Mipmap-Ordner verschoben.

  2. Bilder, die häufig vergrößert (oder extrem verkleinert) werden und deren Qualität für die App von entscheidender Bedeutung ist, werden ebenfalls in den Ordner mipmap verschoben.

  3. Alle anderen Bilder sind übliche Zeichen.

Zitat aus diesem Artikel.

Hayk Nahapetyan
quelle
1
res/
mipmap-mdpi/ic_launcher.png (48x48 pixels)
mipmap-hdpi/ic_launcher.png (72x72)
mipmap-xhdpi/ic_launcher.png (96x96)
mipmap-xxhdpi/ic_launcher.png (144x144)
mipmap-xxxhdpi/ic_launcher.png (192x192)

MipMap für App-Symbol für Launcher

http://android-developers.blogspot.co.uk/2014/10/getting-your-apps-ready-for-nexus-6-and.html

https://androidbycode.wordpress.com/2015/02/14/goodbye-launcher-drawables-hello-mipmaps/

Piyush
quelle
Vielen Dank für diesen zweiten Blog-Beitrag! Es verdeutlicht den Unterschied zwischen der Verwendung von drawable-XXXund mipmap-XXXOrdnern sehr gut: Das Startsymbol unterscheidet sich von anderen Ressourcen, da möglicherweise ein Symbol mit höherer Auflösung im Starter des Benutzers angezeigt wird. Wenn dieses Bild mit höherer Auflösung aus Ihrem Zeichnungsordner entfernt wurde, wird ein Symbol mit niedrigerer Dichte programmgesteuert hochskaliert. Dies kann zu einem unattraktiven verschwommenen Symbol führen.
Winklerrr
Zumindest in Android 8.1 unter Nexus P6 sind die Startsymbole in den Drawables-Ordnern NICHT vergrößert. Eigentlich gar nicht gefunden und die App stürzt beim Öffnen ab.
Matthew
1

Wenn Sie eine APK für eine Zielbildschirmauflösung wie HDPI erstellen, kann das Android-Asset-Packaging-Tool AAPT die Zeichen für eine andere Auflösung entfernen, die Sie nicht benötigen. Wenn sie sich jedoch im Ordner mipmap befindet, bleiben diese Assets im APK, unabhängig von der Zielauflösung.

Evan
quelle
-1

Das Verständnis, das ich über Mipmap habe, ist mehr oder weniger so:

Wenn ein Bild gezeichnet werden muss, müssen einige Skalierungen vorgenommen werden, da wir unterschiedliche Bildschirmgrößen und Auflösungen haben.

Wenn Sie ein Bild haben, das für ein Low-End-Handy in Ordnung ist, müssen Sie beim Skalieren auf die Größe eines 10-Zoll-Tablets Pixel "erfinden", die tatsächlich nicht vorhanden sind. Dies geschieht mit einem Interpolationsalgorithmus Je mehr Pixel erfunden werden müssen, desto länger dauert der Prozess und die Qualität beginnt zu versagen. Die beste Qualität wird mit komplexeren Algorithmen erzielt, die länger dauern (Durchschnitt der umgebenden Pixel im Vergleich zum Kopieren des nächsten Pixels zum Beispiel).

Um die Anzahl der zu erfindenden Pixel zu verringern, stellen Sie mit mipmap verschiedene Größen / Auflösungen desselben Bildes bereit, und das System wählt das Bild aus, das der zu rendernden Auflösung am nächsten kommt, und skaliert von dort aus. Dies sollte die Anzahl der erfundenen Pixel reduzieren, die Ressourcen sparen, die bei der Berechnung dieser Pixel verwendet werden müssen, um ein Bild von guter Qualität bereitzustellen.

Ich habe darüber in einem Artikel gelesen, in dem ein Leistungsproblem in libgdx beim Skalieren von Bildern erläutert wird:

http://www.badlogicgames.com/wordpress/?p=1403

Juan
quelle