Mipmap tirables pour 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 diffèrent-elles des autres images tracables familières?

je vois que dans mon manifeste, nous utilisons la Qualificatif @mipmap/ , au lieu de @drawable/ , ce qui est logique étant donné le nom du dossier ressource:

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

, les Références:

Le Android 4.3 Api le document a ceci à dire:

L'utilisation d'une mipmap comme source pour votre bitmap ou une image de qualité et diverses échelles d'image, qui peuvent être particulièrement utile si vous vous attendez à ce que votre image soit mise à l'échelle animation.

Android 4.2 (API Niveau 17) a ajouté le support pour mipmaps dans le Bitmap Classe-Android échange les images mip dans votre Bitmap lorsque vous avez fourni une source mipmap et ont activé setHasMipMap (). Maintenant dans Android 4.3, vous pouvez également activer mipmaps pour un objet BitmapDrawable, en fournir un actif mipmap et définir l'attribut android:mipMap dans un fichier de ressources bitmap ou en appelant hasMipMap ().

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


XML ressources Bitmap avoir une "151950920 de la propriété":

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

ne s'applique pas aux icônes de lanceur ce que je peux voir.


la question a été soulevée sur Google Groups ( le but du nom de la ressource "mipmap"?! ), à laquelle Romain Guy a répondu:

il est utile de fournir une image à une plus grande résolution qui serait normalement être calculé (par exemple, sur un appareil mdpi, lanceur pourrait vous voulez que la plus grande icône hdpi affiche les raccourcis larges de l'application.)

j'ai l'impression que cela fait presque un sens, mais pas assez.

je suis enclin à suivre Randy Sugianto:

quels en sont les avantages? Est-il un guide sur la façon d'utiliser mipmaps, probablement pour de meilleures icônes de lancement?


bien sûr, Wikipédia 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 se rapporter à L'implémentation actuelle Android.


devrions-nous stocker toutes nos icônes dans res/mipmap dossiers ces jours-ci, et que sont les lignes directrices pour ces images mipmap?


mise à jour n ° 1

voici un billet de blog qui essaie de l'expliquer un peu.

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

Le dossier

Chrome mipmap-hdpi contient trois images. L'un est le logo Chrome, tout seul.

Chrome mipmap-hdpi icon.png

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

c'est peut-être tout cela - nous avons juste besoin de garder plus d'icônes dans le mappage des dossiers?


mise à jour n ° 2

le blog des 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é de L'écran Nexus 6, l'auteur écrit:

il est de la meilleure pratique de placer vos icônes d'application dans mipmap-dossiers (pas le drawable-dossiers) parce qu'ils sont utilisés à des résolutions différentes de l'appareil de la densité de courant. Par exemple, une icône d'application xxxhdpi peut être utilisé sur le lanceur pour un appareil xxhdpi.


mise à jour n ° 3

notez que Android Studio crée les icônes ic_launcher.png dans les dossiers mipmap... plutôt que les dossiers drawable... Qu'Eclipse a utilisé pour les créer.


409
demandé sur Peter Mortensen 2014-05-29 18:29:25

11 réponses

il y a deux utilisations distinctes des cartes à puce:

  1. Pour launcher icônes lors de la construction de la densité spécifique Apk. Certains développeurs construisent des Apk séparés pour chaque densité, pour garder la taille APK faible. Cependant, certains lanceurs (livrés avec certains appareils, ou disponibles sur le Play Store) utilisent des tailles d'icône plus grandes que la norme 48dp. Les lanceurs utilisent getDrawableForDensity et réduire si nécessaire, plutôt que vers le haut, de sorte que les icônes sont de haute qualité. Par exemple sur une tablette hdpi le lanceur peut charger l'icône xhdpi. En plaçant votre icône de lanceur dans le répertoire mipmap-xhdpi, il ne sera pas dépouillé de la façon dont un répertoire-xhdpi dessinable est lors de la construction d'un APK pour les périphériques hdpi. Si vous construisez un APK unique pour tous les appareils, alors cela n'a pas vraiment d'importance car le lanceur peut accéder aux ressources à tirer pour la densité désirée.

  2. Le mappage de l'API à partir de 4.3. Je ne l'ai pas utilisé et je ne suis pas familier avec elle. Il n'est pas utilisé par les lanceurs de projet Open Source Android et je ne sais pas si d'autres lanceurs utilisent.

242
répondu Kevin TeslaCoil 2018-04-07 23:36:44

il semble que Google ont mis à jour leurs docs depuis toutes ces réponses, donc espérons que cela aidera quelqu'un d'autre à l'avenir :) vient de tomber sur cette question moi-même, tout en créant un nouveau (nouveau) projet.

TL; DR: les tirables peuvent être retirés dans le cadre de l'optimisation des ressources spécifique au PDD. Cette option ne sera pas dépouillé.

différentes applications de lanceur d'écran d'accueil sur différents appareils montrent le lanceur d'application les icônes à différentes résolutions. Lorsque les techniques d'optimisation des ressources de l'application suppriment des ressources pour des densités d'écran inutilisées, les icônes de lanceur peuvent finir par paraître flou parce que l'application de 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 de lancement. Le système Android préserve ces ressources indépendamment de la densité de stripping, et garantit que les applications de lanceur peuvent choisir des icônes avec la meilleure résolution pour afficher.

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

72
répondu Kazuaki 2015-05-27 05:52:26

en quoi ces images mipmap diffèrent-elles des autres images dessinables familières?

Voici mes deux cents, en essayant d'expliquer la différence. Il ya deux cas que vous traitez avec lorsque vous travaillez avec des images sur Android:

  1. Vous voulez charger une image pour votre appareil densité et vous allez l'utiliser "comme", sans changer sa taille réelle . Dans ce cas, vous devrait fonctionner avec drawables et Android vous donnera la meilleure image ajustable.

  2. vous voulez charger une image pour la densité de votre périphérique, mais cette image va être augmentée ou diminuée . Par exemple, cela est nécessaire lorsque vous voulez afficher une icône de lanceur plus grande, ou vous avez une animation, qui augmente la taille de l'image. Dans de tels cas, pour assurer la meilleure qualité d'image, vous devez mettre votre image dans mipmap le dossier. Ce que Android va faire, il va essayer de ramasser l'image à partir d'une densité plus élevée seau au lieu de l'échelle. Cela augmentera la netteté (qualité) de l'image.

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

  • lanceur icônes toujours aller dans mipmap dossier.
  • Images, qui sont souvent redimensionné (ou extrêmement réduit) et dont la qualité est critique pour l'application, allez dans mipmap dossier ainsi.
  • toutes les autres images sont habituelles tirables .
26
répondu sergej shafarenka 2015-09-01 10:14:55

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

chaque image bitmap de l'ensemble mipmap est une copie réduite de la texture principale, mais à un certain niveau de détail réduit. Bien que l' la texture principale serait encore utilisée lorsque la vue est suffisante pour rendre il en détail, le renderer passera à une image mipmap appropriée (...) lorsque la texture est considéré à distance ou en petite taille.

bien que ceci soit décrit comme une technique pour les graphiques 3D (comme il mentionne" affichage à distance"), il s'applique tout aussi bien à 2D (traduit par" dessiné est un espace plus petit", i.e."downscaled").

pour un exemple concret D'Android, imaginez que vous avez une vue avec un certain fond de dessin (en particulier, un BitmapDrawable ). Vous utilisez maintenant une animation pour la mettre à l'échelle à 0,15 de sa taille originale. Normalement, cela nécessiterait d'en réduire l'image d'arrière-plan pour chaque image. Cette réduction" extrême " de l'échelle peut toutefois produire des artefacts visuels.

vous pouvez, cependant, fournir une 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 la taille de 1,0, elle passera à l'image de 0,5 et de la réduire, ce qui devrait fournir un meilleur résultat. Et ainsi de suite alors que l'animation continue.

c'est un peu théorique, puisque c'est en fait fait fait par le renderer. Selon la source de la classe Bitmap, c'est juste un indice, et le renderer 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 suis pas tout à fait sûr pourquoi cela serait particulièrement approprié pour les icônes d'application, cependant. Bien que Android sur les tablettes, ainsi que certains lanceurs (par exemple GEL), Demander une icône "une densité plus haut" pour le Montrer plus grand, ceci est supposé être fait en utilisant le mécanisme régulier (i.e. drawable-xxxhdpi , &c).

23
répondu matiash 2014-06-08 01:59:13

une chose que j'ai mentionnée dans un autre fil qui vaut la peine d'être soulignée -- si vous construisez différentes versions de votre application pour différentes densités, vous devriez être au courant du répertoire de ressources" mipmap". C'est exactement comme des ressources "drawables", sauf qu'il ne participe pas au stripping de densité lors de la création des différentes cibles apk.

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

10
répondu kreker 2015-01-17 01:34:15

étant donné que je cherchais une réponse claire à cette question pour déterminer le bon type d'icônes de notification, j'aimerais ajouter cette déclaration claire au sujet. Ça vient de http://developer.android.com/tools/help/image-asset-studio.html#saving

Note: les fichiers d'icône de lanceur résident dans un endroit différent de celui de d'autres icônes. Ils sont situés dans le répertoire mipmap/. toute autre icône les dossiers résident dans le tirable / dossier de votre projet.

4
répondu Stev 2016-03-22 00:38:38

Il ya deux cas que vous traitez avec lorsque vous travaillez avec des images sur Android:

  1. Vous voulez charger une image pour votre appareil densité et que vous allez utiliser "tel quel", sans changer sa taille réelle. Dans ce cas, vous devrait fonctionner avec les drawables et Android vous donnera le meilleur ajustement image.
  2. Vous voulez charger une image pour votre appareil densité, mais cette image va être mis à l'échelle vers le haut ou vers le bas. Par exemple ceci est nécessaire lorsque vous souhaitez afficher un plus grand icône de lancement, ou vous avez une animation, qui augmente la taille de votre image. Dans de tels cas, pour assurer la meilleure qualité d'image, vous devez mettre votre image dans le dossier mipmap. Ce que Android va faire est de, il va essayer de ramasser l'image à partir d'une densité plus élevée seau au lieu de l'échelle.

DONC

ainsi, la règle du pouce pour décider où mettre votre image dans be:

  1. les icônes de lancement vont toujours dans le dossier mipmap.

  2. Images, qui sont souvent augmentées (ou extrêmement réduites) et dont la qualité est critique pour l'application, aller dans le dossier mipmap comme bien.

  3. toutes les autres images sont des dessins habituels.

Citation de cet" article 1519400920".

2
répondu Hayk Nahapetyan 2017-07-07 09:07:37

si vous construisez un APK pour une résolution d'écran cible comme HDPI, L'outil de packaging Android asset,AAPT,peut supprimer les tirages pour une autre résolution dont vous n'avez pas besoin.Mais s'il est dans le dossier mipmap,alors ces actifs resteront dans L'APK, quelle que soit la résolution cible.

0
répondu Evan 2016-10-01 05:27:25

lors de la construction d'apks séparés pour des densités différentes, des dossiers dessinables pour d'autres densités sont dépouillés. Cela rendra les icônes apparaissent flou dans les appareils qui utilisent des icônes de lanceur de densité plus élevée. Puisque les dossiers mipmap ne sont pas dépouillés, il est toujours préférable de les utiliser pour inclure les icônes de lanceur.

0
répondu Fartab 2017-01-10 06:56:32

la compréhension que j'ai de mipmap est plus ou moins comme ceci:

quand une image doit être dessinée, étant donné que nous avons différentes tailles d'écran sont des résolutions, une certaine mise à l'échelle devra prendre part.

si vous avez une image qui est ok pour un téléphone cellulaire bas de gamme, quand vous l'échelle à la taille d'une tablette de 10 "vous devez" inventer " des pixels qui n'existent pas réellement. Ceci est fait avec un algorithme d'interpolation. Le plus de pixels que il faut inventer, plus le processus prend de temps et la qualité commence à échouer. La meilleure qualité est obtenue avec des algorithmes plus complexes qui prennent plus de temps (moyenne des pixels environnants vs copier le pixel le plus proche par exemple).

pour réduire le nombre de pixels qui doivent être inventés, avec mipmap vous fournissez différentes tailles/rsolutions de la même image, et le système choisira l'image la plus proche de la résolution qui doit être rendue et faire l'échelle à partir de là. Ce devrait réduire le nombre de pixels inventés économisant des ressources à utiliser dans le calcul de ces pixels pour fournir une image de bonne qualité.

j'ai lu à ce sujet dans un article expliquant un problème de performance dans libgdx lors de la mise à l'échelle des images:

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

-1
répondu Juan 2014-06-07 12:02:31
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 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 /

-1
répondu Piyush 2015-07-03 09:28:24