web-dev-qa-db-fra.com

Mipmap drawables pour les icônes

Depuis Android 4.3 (Jelly Bean), nous pouvons maintenant utiliser les dossiers res/mipmap pour stocker des images "mipmap".

Par exemple, Chrome pour Android stocke ses icônes dans ces dossiers au lieu des dossiers plus normaux res/drawable.

En quoi ces images mipmap sont-elles différentes des autres images pouvant être dessinées de manière familière?

Je vois que dans mon manifeste, nous utilisons le qualificatif @mipmap/, au lieu de @drawable/, ce qui est logique compte tenu du nom du dossier de ressources:

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

Références:

Le document Android 4.3 API indique ce qui suit:

Utiliser un mipmap en tant que source de votre image bitmap ou dessinable est un moyen simple de fournir une image de qualité et diverses échelles d'image, ce qui peut s'avérer particulièrement utile si vous souhaitez que votre image soit redimensionnée au cours d'une animation.

Android 4.2 (niveau 17 de l'API) a ajouté la prise en charge des mipmap dans la classe Bitmap: Android permute les images mip dans votre bitmap lorsque vous avez fourni une source de mipmap et activé setHasMipMap (). Désormais, dans Android 4.3, vous pouvez également activer les mipmaps pour un objet BitmapDrawable, en fournissant un actif mipmap et en définissant l'attribut Android: mipMap dans un fichier de ressources bitmap ou en appelant hasMipMap ().

Je ne vois rien là-dedans qui m'aide à comprendre.


ressources XML Bitmap ont une propriété Android:mipMap:

Booléen Active ou désactive l'indicateur de mipmap. Voir setHasMipMap () pour plus d'informations. La valeur par défaut est false.

Cela ne s'applique pas aux icônes de lanceur dans la mesure où je peux voir.


La question a été posée sur Google Groupes (Le nom de la ressource "mipmap"?!), à laquelle Romain Guy a répondu:

Il est utile de fournir une image à une résolution plus grande qui serait normalement calculée (par exemple, sur un périphérique mdpi, Launcher voudra peut-être que l'icône hdpi plus grande affiche des raccourcis d'application volumineux.)

J'ai l'impression que cela en a presque un sens, mais pas tout à fait.

Je suis toujours enclin à suivre le suivi de Randy Sugianto:

Quels sont les avantages de cela? Existe-t-il un guide sur l'utilisation des mipmaps, probablement pour de meilleures icônes de lanceur?


Bien sûr, Wikipedia a une page pour "Mipmap" , qui fait référence à une technique plus ancienne inventée en 1983, que je ne peux pas tout à fait comprendre la mise en oeuvre actuelle de Android.


Devrions-nous stocker toutes nos icônes d'application dans les dossiers res/mipmap de nos jours et quelles sont les consignes pour ces images mipmap?


Mise à jour # 1

Voici un article de blog qui tente de l'expliquer un peu.

Mais l'image utilisée dans cet article de blog montre à quoi ressemble un fichier contenant de nombreux logos. Ce n'est pas ce que je vois dans le dossier mipmap de Chrome.

Le dossier mipmap-hdpi de Chrome contient trois images. Le premier est le logo Chrome, seul.

Chrome mipmap-hdpi icon.png

Étrangement, c'est 72x72, pas 48x48 que je m'attendrais à voir.

C’est peut-être tout ce qu’il ya à faire - nous devons simplement conserver de plus grandes icônes dans les dossiers mipmap?


Mise à jour # 2

Le billet de blog de développeurs Android du 23/10/2014 confirme à nouveau l’idée d’utiliser les dossiers mipmap pour les icônes d’application:

En parlant de la densité d'écran du Nexus 6, l'auteur écrit:

Il est préférable de placer les icônes de vos applications dans des dossiers mipmap (et non dans les dossiers dessinés), car ils sont utilisés à des résolutions différentes de la densité actuelle de l'appareil. Par exemple, une icône d'application xxxhdpi peut être utilisée sur le lanceur pour un périphérique xxhdpi.


Mise à jour # 3

Notez que Android Studio crée les icônes ic_launcher.png dans les dossiers mipmap... plutôt que les dossiers drawable... utilisés par Eclipse pour les créer.


435

Il existe deux utilisations distinctes des mipmaps:

  1. Pour les icônes de lanceur lors de la création de fichiers APK spécifiques à la densité. Certains développeurs construisent des APK distincts pour chaque densité, afin de réduire la taille de l'APK. Cependant, certains lanceurs (livrés avec certains appareils ou disponibles sur le Play Store) utilisent des tailles d'icônes plus grandes que le 48dp standard. Les lanceurs utilisent getDrawableForDensity et réduisent au besoin plutôt que vers le haut, les icônes sont donc de haute qualité. Par exemple, sur une tablette hdpi, le lanceur pourrait charger l'icône xhdpi. En plaçant l'icône de votre lanceur dans le répertoire mipmap-xhdpi, il ne sera pas supprimé comme un répertoire drawable-xhdpi lors de la création d'un fichier APK pour les périphériques hdpi. Si vous construisez un seul APK pour tous les appareils, cela n'a pas vraiment d'importance, car le lanceur peut accéder aux ressources pouvant être extraites pour obtenir la densité souhaitée.

  2. L'API mipmap actuelle à partir de 4.3. Je ne l'ai pas utilisé et je ne le connais pas. Il n'est pas utilisé par les lanceurs de projet Open Source Android et je ne suis au courant d'aucun autre lanceur utilisant.

253
Kevin TeslaCoil

Il semble que Google ait mis à jour sa documentation depuis toutes ces réponses, alors j'espère que cela aidera quelqu'un d'autre à l'avenir :) Je viens juste de trouver cette question moi-même, tout en créant un nouveau (nouveau nouveau) projet.

TL; DR: les éléments dessinables peuvent être supprimés dans le cadre de l'optimisation des ressources spécifiques à dp. Les mipmaps ne seront pas supprimés.

Différentes applications de lanceur d’écran d’accueil sur différents appareils affichent les icônes du lanceur d’applications à différentes résolutions. Lorsque les techniques d'optimisation des ressources d'application suppriment les ressources pour les densités d'écran inutilisées, les icônes du lanceur peuvent sembler floues, car l'application du lanceur doit mettre à niveau une icône de résolution inférieure pour l'affichage. Pour éviter ces problèmes d'affichage, les applications doivent utiliser les dossiers de ressources mipmap/ pour les icônes du programme de lancement. Le système Android préserve ces ressources, quelle que soit l'élimination de la densité, et garantit que les applications de lancement peuvent choisir des icônes avec la meilleure résolution d'affichage.

(de http://developer.Android.com/tools/projects/index.html#mipmap )

76
Kazuaki

En quoi ces images mipmap sont-elles différentes des autres images pouvant être dessinées?

Voici mes deux cents en essayant d'expliquer la différence. Vous travaillez dans deux cas lorsque vous travaillez avec des images dans Android:

  1. Vous souhaitez charger une image correspondant à la densité de votre appareil et vous allez l'utiliser "telle quelle", sans changer sa taille réelle . Dans ce cas, vous devriez travailler avec drawables et Android vous donnera la meilleure image.

  2. Vous souhaitez charger une image correspondant à la densité de votre appareil, mais cette image va être agrandie ou réduite . Par exemple, cela est nécessaire lorsque vous souhaitez afficher une icône de lanceur plus grande ou si vous avez une animation qui augmente la taille de l'image. Dans de tels cas, pour assurer la meilleure qualité d'image, vous devez placer votre image dans le dossier mipmap. Ce que Android va faire, c’est essayer de récupérer l’image dans un compartiment de densité supérieure au lieu de l’agrandir. Cela augmentera la netteté (qualité) de l'image.

Ainsi, la règle de base pour décider où placer votre image serait:

  • Les icônes de lancement entrent toujours dans le dossier mipmap.
  • Les images, qui sont souvent agrandies (ou extrêmement réduites) et dont la qualité est essentielle pour l'application, vont dans mipmap dossier aussi bien.
  • Toutes les autres images sont habituelles dessinables.
27
sergej shafarenka

L'implémentation de Android de mipmaps en 4.3 est exactement la technique de 1983 expliquée dans l'article de Wikipédia :)

Chaque image bitmap de l'ensemble mipmap est une copie en taille réduite de la texture principale, mais à un certain niveau de détail réduit. Bien que la texture principale soit toujours utilisée lorsque la vue est suffisante pour générer un rendu détaillé, le moteur de rendu bascule sur une image mappée appropriée (...) lorsque la texture est visualisée à distance ou à petite taille.

Bien que ceci soit décrit comme une technique pour les graphiques 3D (comme il est mentionné "visualisation à distance"), il s’applique également à la 2D (traduit par "l’espace dessiné est plus petit", c’est-à-dire "réduit".

Pour un exemple concret Android, imaginons que vous disposiez d'une vue avec un certain arrière-plan dessinable (en particulier une BitmapDrawable). Vous utilisez maintenant une animation pour la redimensionner à 0,15 de sa taille originale. Normalement, cela nécessiterait de réduire la taille du bitmap d'arrière-plan pour chaque image. Cette réduction "extrême", cependant, peut produire des artefacts visuels.

Vous pouvez cependant fournir un mipmap, ce qui signifie que l'image est déjà pré-rendue pour quelques échelles spécifiques (disons 1.0, 0.5 et 0.25). Chaque fois que l'animation "franchit" le seuil de 0,5, au lieu de continuer à réduire l'image originale de taille 1.0, elle bascule vers l'image 0.5 et la réduit, ce qui devrait fournir un meilleur résultat. Et ainsi de suite pendant l'animation.

C'est un peu théorique, puisque c'est le moteur de rendu qui le fait. Selon la source de la classe Bitmap, il ne s'agit que d'un indice, et le rendu peut ou non l'honorer.

/**
 * 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);
}

Je ne sais pas trop pourquoi cela conviendrait particulièrement aux icônes d'applications. Bien que Android sur les tablettes, ainsi que certains lanceurs (par exemple, GEL), demande une icône "une densité supérieure" pour l'agrandir, cela est supposé être effectué à l'aide du mécanisme habituel (c'est-à-dire drawable-xxxhdpi, etc.

23
matiash

Une chose que j'ai mentionnée dans un autre sujet mérite d'être signalée: si vous construisez différentes versions de votre application pour différentes densités, vous devez connaître le répertoire de ressources "mipmap". Ceci est exactement comme les ressources "extractibles", à la différence qu'il ne participe pas au dépouillement de la densité lors de la création des différentes cibles apk.

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

11
kreker

Puisque je cherchais une réponse précise à cette question afin de déterminer le type approprié pour les icônes de notification, j'aimerais ajouter cette déclaration claire au sujet. C'est de http://developer.Android.com/tools/help/image-asset-studio.html#saving

Remarque: les fichiers d'icônes du programme de lancement se trouvent à un emplacement différent de celui des autres icônes. Ils sont situés dans le dossier mipmap /. Tous les autres fichiers d'icônes résident dans le dossier/de dessin de votre projet.

4
Stev

Il existe deux cas de figure lorsque vous travaillez avec des images sous Android:

  1. Vous souhaitez charger une image correspondant à la densité de votre appareil et vous allez l'utiliser "telle quelle", sans changer sa taille réelle. Dans ce cas, vous devriez travailler avec des éléments dessinables et Android vous donnera la meilleure image.
  2. Vous souhaitez charger une image correspondant à la densité de votre appareil, mais cette image va être agrandie ou réduite. Par exemple, cela est nécessaire lorsque vous souhaitez afficher une icône de lanceur plus grande ou si vous avez une animation qui augmente la taille de l'image. Dans de tels cas, pour assurer la meilleure qualité d'image, vous devez placer votre image dans le dossier mipmap. Ce que Android va faire, c’est essayer de récupérer l’image dans un compartiment de densité supérieure au lieu de l’agrandir.

SO

Ainsi, la règle de base pour décider où placer votre image serait:

  1. Les icônes du lanceur vont toujours dans le dossier mipmap.

  2. Les images, qui sont souvent agrandies (ou extrêmement réduites) et dont la qualité est essentielle pour l'application, sont également placées dans le dossier mipmap.

  3. Toutes les autres images sont des dessinables habituels.

Citation de this article.

2
Hayk Nahapetyan

Si vous créez un fichier APK pour une résolution d'écran cible telle que HDPI, l'outil de regroupement d'actifs Android, AAPT, peut supprimer les éléments dessinables pour obtenir une résolution dont vous n'avez pas besoin. ces actifs resteront dans l'APK, quelle que soit la résolution cible.

1
Evan
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 pour l'icône de l'application pour le lanceur

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/

1
Piyush

Lors de la construction d'apks distincts pour différentes densités, les dossiers pouvant être dessinés pour d'autres densités sont supprimés. Cela rendra les icônes floues sur les périphériques utilisant des icônes de lanceur de densité supérieure. Comme les dossiers mipmap ne sont pas supprimés, il est toujours préférable de les utiliser pour inclure les icônes du lanceur.

1
Fartab