474 Stimmen

Mipmap-Zeichnungen für Symbole

Seit Android 4.3 (Jelly Bean) können wir jetzt die res/mipmap-Ordner verwenden, um "mipmap"-Bilder zu speichern.

Zum Beispiel speichert Chrome für Android seine Symbole in diesen Ordnern anstelle der normaleren res/drawable-Ordner.

Wie unterscheiden sich diese mipmap-Bilder von den anderen vertrauten drawable-Bildern?

Ich sehe, dass wir in meinem Manifest den @mipmap/-Qualifier verwenden, anstatt @drawable/, was angesichts des Namens des Ressourcenordners Sinn macht:


Referenzen:

Das Dokument zu den Android 4.3 APIs sagt folgendes:

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

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

Ich sehe dort nichts, was mir hilft, das zu verstehen.


XML-Bitmap-Ressourcen haben eine android:mipMap-Eigenschaft:

Boolean. Aktiviert oder deaktiviert den Mipmap-Hinweis. Weitere Informationen finden Sie unter setHasMipMap(). Der Standardwert ist falsch.

Dies gilt meiner Meinung nach nicht für Launcher-Symbole.


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

Es ist nützlich, ein Bild in einer größeren Auflösung bereitzustellen, das normalerweise berechnet würde (beispielsweise möchte der Launcher auf einem mdpi-Gerät das größere hdpi-Symbol anzeigen, um große App-Verknüpfungen anzuzeigen.)

Ich habe das Gefühl, dass das fast Sinn macht, aber nicht ganz.

Ich neige immer noch zu Randys Sugiantos Nachfrage:

Was sind die Vorteile davon? Gibt es eine Anleitung zum Verwenden von Mipmaps, möglicherweise für bessere Launcher-Symbole?


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


Sollten wir heute alle unsere App-Symbole in res/mipmap-Ordnern speichern und was sind die Richtlinien für diese Mipmap-Bilder?


Aktualisierung #1

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

Aber das Bild, das in diesem Blog-Beitrag verwendet wird, zeigt, was wie eine Datei mit vielen Logos aussieht. Das ist nicht das, was ich im Mipmap-Ordner von Chrome sehe.

Im mipmap-hdpi-Ordner von Chrome befinden sich drei Bilder. Eins ist das Chrome-Logo, alleine.

Chrome mipmap-hdpi icon.png

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

Vielleicht ist das alles, was es dazu gibt - wir müssen einfach größere Symbole in den Mipmap-Ordnern aufbewahren?


Aktualisierung #2

Der Blog-Beitrag der Android-Entwickler vom 23.10.2014 bestätigt erneut die Idee, die mipmap-Ordner für Anwendungssymbole zu verwenden:

Bei der Diskussion über die Bildschirmdichte des Nexus 6 schreibt der Autor:

Es ist bewährte Praxis, Ihre App-Symbole in den mipmap-Ordnern (nicht den drawable-Ordnern) zu platzieren, da sie in Auflösungen verwendet werden, die sich von der aktuellen Dichte des Geräts unterscheiden. Zum Beispiel kann ein xxxhdpi-App-Symbol auf dem Launcher für ein xxhdpi-Gerät verwendet werden.


Aktualisierung #3

Beachten Sie, dass Android Studio die ic_launcher.png-Symbole in den mipmap...-Ordnern erstellt, anstatt in den drawable...-Ordnern, in denen Eclipse sie zu erstellen pflegte.


269voto

Kevin TeslaCoil Punkte 9917

Es gibt zwei verschiedene Verwendungen von Mipmaps:

  1. Für Launcher-Symbole beim Erstellen von dichtespezifischen APKs. Einige Entwickler erstellen separate APKs für jede Dichte, um die APK-Größe gering zu halten. Einige Launcher (die mit einigen Geräten ausgeliefert werden oder im Play Store erhältlich sind) verwenden jedoch größere Symbolgrößen als die Standardgröße von 48dp. Launcher verwenden getDrawableForDensity und skalieren gegebenenfalls herunter anstatt hoch, sodass die Symbole in hoher Qualität sind. Beispielsweise könnte der Launcher auf einem hdpi-Tablet das xhdpi-Symbol laden. Wenn Sie Ihr Launcher-Symbol in das Verzeichnis mipmap-xhdpi legen, wird es nicht wie ein Verzeichnis drawable-xhdpi gestrippt, wenn ein APK für hdpi-Geräte erstellt wird. Wenn Sie ein einzelnes APK für alle Geräte erstellen, spielt dies keine Rolle, da der Launcher auf die Zeichenressourcen für die gewünschte Dichte zugreifen kann.

  2. Die eigentliche Mipmap-API ab 4.3. Ich habe dies nicht verwendet und bin damit nicht vertraut. Sie wird nicht von den Launchern des Android Open Source-Projekts verwendet, und mir ist kein anderer Launcher bekannt, der sie verwendet.

80voto

Kazuaki Punkte 947

Es scheint, dass Google ihre Dokumentation aktualisiert haben, seit all diesen Antworten, also hoffentlich wird dies auch jemand anderem in Zukunft helfen :) Bin gerade über diese Frage gestolpert, während ich ein neues (neues neues) Projekt erstellt habe.

Zusammenfassung: Zeichnungen können im Rahmen der spezifischen Ressourcenoptimierung für dp entfernt werden. Mipmaps werden nicht entfernt.

Verschiedene Startbildschirm-Launcher-Apps auf verschiedenen Geräten zeigen App-Symbole in verschiedenen Auflösungen an. Wenn App-Ressourcenoptimierungstechniken Ressourcen für ungenutzte Bildschirmdichten entfernen, können App-Symbole verschwommen aussehen, da die Launcher-App ein Symbol mit geringerer Auflösung für die Anzeige hochskalieren muss. Um diese Anzeigeprobleme zu vermeiden, sollten Apps die mipmap/ -Ressourcenordner für Startbildschirmsymbole verwenden. Das Android-System bewahrt diese Ressourcen unabhängig von der Dichte-Entfernung 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)

29voto

sergej shafarenka Punkte 19870

Wie unterscheiden sich diese Mipmap-Bilder von den anderen vertrauten drawable-Bildern?

Hier ist mein Beitrag, um den Unterschied zu erklären. Es gibt zwei Fälle, mit denen man sich bei der Arbeit mit Bildern in Android beschäftigt:

  1. Sie möchten ein Bild für die Bildschirmauflösung Ihres Geräts laden und es "so wie es ist" verwenden, ohne die tatsächliche Größe zu ändern. In diesem Fall sollten Sie mit drawables arbeiten und Android wird Ihnen das bestmögliche Bild geben.

  2. Sie möchten ein Bild für die Bildschirmauflösung Ihres Geräts laden, aber dieses Bild soll skaliert werden. Zum Beispiel ist dies erforderlich, wenn Sie ein größeres Launcher-Symbol anzeigen möchten oder wenn Sie eine Animation haben, die die Größe des Bildes erhöht. In solchen Fällen sollten Sie Ihr Bild in den mipmap-Ordner legen, um die bestmögliche Bildqualität zu gewährleisten. Was Android tun wird, ist, das Bild aus einem höheren Dichte-Bucket auszuwählen, anstatt es hochzuskalieren. Dies erhöht die Schärfe (Qualität) des Bildes.

Daher könnte die Faustregel, um zu entscheiden, wohin Sie Ihr Bild legen sollen, sein:

  • Launcher-Symbole gehören immer in den mipmap-Ordner.
  • Bilder, die oft skaliert werden (oder extrem verkleinert sind) und deren Qualität für die App entscheidend ist, gehören ebenfalls in den mipmap-Ordner.
  • Alle anderen Bilder sind normale drawables.

24voto

matiash Punkte 53991

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

Jedes Bitmapbild des Mipmap-Sets ist eine verkleinerte Kopie der Haupttextur, jedoch auf einem bestimmten reduzierten Detaillierungsgrad. Obwohl die Haupttextur immer noch verwendet wird, wenn die Ansicht ausreicht, um sie im vollen Detail darzustellen, wird der Renderer auf ein geeignetes Mipmap-Bild umschalten (...) wenn die Textur aus der Ferne betrachtet wird oder in kleiner Größe.

Obwohl dies als Technik für 3D-Grafiken beschrieben wird (da es "aus der Entfernung betrachten" erwähnt), gilt dies genauso gut für 2D (übersetzt als "in einem kleineren Bereich gezeichnet", d.h. "verkleinert").

Als konkretes Android-Beispiel: Stellen Sie sich vor, Sie haben eine Ansicht mit einem bestimmten Hintergrund-Drawable (insbesondere ein BitmapDrawable). Sie verwenden nun eine Animation, um es auf 0,15 seiner Originalgröße zu skalieren. Normalerweise müsste der Hintergrundbitmap für jedes Frame verkleinert werden. Diese "extreme" Verkleinerung kann jedoch visuelle Artefakte produzieren.

Sie können jedoch ein Mipmap bereitstellen, was bedeutet, dass das Bild bereits für einige spezifische Skalierungen vorgerendert ist (sagen wir 1.0, 0.5 und 0.25). Immer wenn die Animation die 0.5-Schwelle "überschreitet", anstatt weiterhin das Original in der Größe 1.0 zu verkleinern, wird auf das 0.5-Bild umgeschaltet und verkleinert, was ein besseres Ergebnis liefern sollte. Und so weiter, während die Animation fortgesetzt wird.

Dies ist ein wenig theoretisch, da es tatsächlich vom Renderer erledigt wird. Laut der Quelle der Bitmap-Klasse ist es nur ein Hinweis, und der Renderer kann ihn möglicherweise ignorieren oder befolgen.

/**
 * Legen Sie einen Hinweis für den Renderer fest, der für das Zeichnen dieser Bitmap verantwortlich ist
 * der angibt, dass er versuchen sollte, Mipmaps zu verwenden, wenn diese Bitmap
 * skaliert wird.
 *
 * Wenn Sie wissen, dass Sie diese Bitmap mit weniger als
 * 50% ihrer Originalgröße zeichnen werden, können Sie eine höhere
 * Qualität erhalten, indem Sie diese Eigenschaft einschalten.
 * 
 * Beachten Sie, dass der Renderer diesen Hinweis respektieren
 * muss, könnte aber zusätzlichen Speicher reservieren, um die Mipmap-Ebenen für diese Bitmap zu halten.
 *
 * Diese Eigenschaft ist nur ein Vorschlag, den der Renderer ignorieren kann.
 * Es wird nicht garantiert, dass er irgendwelche Auswirkungen hat.
 *
 * @param hasMipMap gibt an, ob der Renderer versuchen sollte
 *                  Mipmaps zu verwenden
 *
 * @siehe #hasMipMap()
 */
public final void setHasMipMap(boolean hasMipMap) {
    nativeSetHasMipMap(mNativeBitmap, hasMipMap);
}

Ich bin mir nicht ganz sicher, warum dies besonders für Anwendungsikonen geeignet wäre. Obwohl Android auf Tablets sowie einige Launcher (z.B. GEL) ein Icon "eine Dichte höher" anfordern, um es größer anzuzeigen, soll dies über den regulären Mechanismus erfolgen (d.h. drawable-xxxhdpi, etc.).

11voto

kreker Punkte 5697

Eine Sache, die ich in einem anderen Thread erwähnt habe, die es sich lohnt zu erwähnen - wenn Sie verschiedene Versionen Ihrer App für verschiedene Dichten erstellen, sollten Sie über das Ressourcenverzeichnis "mipmap" Bescheid wissen. Dies ist genau wie "drawable" Ressourcen, außer dass es nicht am Dichte-Stripping teilnimmt, wenn die verschiedenen APK-Ziele erstellt werden.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X