Mipmap dibujables para iconos

449

Desde Android 4.3 (Jelly Bean) ahora podemos hacer uso de las res/mipmapcarpetas para almacenar imágenes "mipmap".

Por ejemplo, Chrome para Android almacena sus iconos en estas carpetas en lugar de las res/drawablecarpetas más normales .

¿En qué se diferencian estas imágenes mipmap de las otras imágenes dibujables familiares?

Veo que en mi manifiesto, usamos el @mipmap/calificador, en lugar de @drawable/, lo que tiene sentido dado el nombre de la carpeta de recursos:

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

Referencias

El documento de las API de Android 4.3 tiene lo siguiente que decir:

Usar un mapa MIP como fuente para su mapa de bits o dibujable es una manera simple de proporcionar una imagen de calidad y varias escalas de imagen, lo que puede ser particularmente útil si espera que su imagen se escale durante una animación.

Android 4.2 (API nivel 17) agregó soporte para mipmaps en la clase de mapa de bits: Android intercambia las imágenes de mip en su mapa de bits cuando ha suministrado una fuente de mapa de mip y ha habilitado setHasMipMap (). Ahora, en Android 4.3, puede habilitar mapas mip para un objeto BitmapDrawable también, proporcionando un recurso mipmap y configurando el atributo android: mipMap en un archivo de recursos de mapa de bits o llamando a hasMipMap ().

No veo nada allí que me ayude a entender.


Los recursos de mapa de bits XML tienen una android:mipMappropiedad:

Booleano Habilita o deshabilita la sugerencia de mipmap. Consulte setHasMipMap () para obtener más información. El valor predeterminado es falso.

Esto no se aplica a los íconos del iniciador hasta donde puedo ver.


La pregunta se planteó en Grupos de Google (¿ El propósito del nombre del recurso "mipmap"? ), A lo que Romain Guy respondió:

Es útil proporcionar una imagen con una resolución más grande que normalmente se calcularía (por ejemplo, en un dispositivo mdpi, Launcher puede querer que el ícono hdpi más grande muestre accesos directos de aplicaciones grandes).

Siento que esto casi tiene sentido, pero no del todo.

Todavía estoy dispuesto a seguir con el seguimiento de Randy Sugianto:

¿Cuáles son las ventajas de esto? ¿Hay alguna guía sobre cómo usar mipmaps, probablemente para mejores íconos de inicio?


Por supuesto, Wikipedia tiene una página para "Mipmap" , que se refiere a una técnica más antigua inventada en 1983, que no puedo identificar con la implementación actual de Android.


¿Deberíamos almacenar todos los íconos deres/mipmap nuestras aplicaciones en carpetas estos días, y cuáles son las pautas para estas imágenes mipmap?


Actualización n. ° 1

Aquí hay una publicación de blog que intenta explicarlo un poco.

Pero la imagen utilizada en esa publicación de blog muestra lo que parece un archivo con muchos logotipos. Esto no es lo que veo en la carpeta mipmap de Chrome.

La mipmap-hdpicarpeta de Chrome contiene tres imágenes. Uno es el logotipo de Chrome, por sí solo.

Chrome mipmap-hdpi icon.png

Curiosamente, es 72x72, no 48x48 lo que esperaría ver.

Quizás eso es todo lo que hay que hacer: ¿solo necesitamos mantener íconos más grandes en las carpetas de mipmap?


Actualización n. ° 2

La publicación de Android Developers Blog del 23/10/2014 confirma nuevamente la idea de usar las mipmapcarpetas para los iconos de las aplicaciones:

Al hablar sobre la densidad de pantalla del Nexus 6, el autor escribe:

Es una buena práctica colocar los íconos de su aplicación en carpetas mipmap (no en las carpetas dibujables) porque se usan en resoluciones diferentes de la densidad actual del dispositivo. Por ejemplo, se puede usar un icono de la aplicación xxxhdpi en el iniciador para un dispositivo xxhdpi.


Actualización n. ° 3

Tenga en cuenta que Android Studio crea los ic_launcher.pngíconos en las mipmap...carpetas en lugar de las drawable...carpetas que Eclipse usó para crearlos.


Richard Le Mesurier
fuente

Respuestas:

260

Hay dos usos distintos de mipmaps:

  1. Para los íconos del iniciador cuando se crean APK específicos de densidad. Algunos desarrolladores crean APK separados para cada densidad, para mantener el tamaño del APK bajo. Sin embargo, algunos lanzadores (enviados con algunos dispositivos o disponibles en Play Store) usan íconos de mayor tamaño que los 48dp estándar. Los lanzadores usan getDrawableForDensity y reducen la escala si es necesario, en lugar de hacerlo hacia arriba, por lo que los iconos son de alta calidad. Por ejemplo, en una tableta hdpi, el iniciador puede cargar el icono xhdpi. Al colocar el ícono del iniciador en el directorio mipmap-xhdpi, no se eliminará de la forma en que se utiliza un directorio drawable-xhdpi al crear un APK para dispositivos hdpi. Si está creando un solo APK para todos los dispositivos, entonces esto realmente no importa, ya que el iniciador puede acceder a los recursos extraíbles para la densidad deseada.

  2. La API mipmap real de 4.3. No he usado esto y no estoy familiarizado con él. No es utilizado por los lanzadores de Android Open Source Project y no estoy al tanto de ningún otro iniciador que lo use.

Kevin TeslaCoil
fuente
2
¿Entonces está sugiriendo un script de compilación que elimine las carpetas de densidad incorrectas para todos menos los recursos de mipmap, si lo entiendo correctamente?
Richard Le Mesurier
20
Sugeriría simplemente construir un APK para todas las densidades y no preocuparse por eso. Pero sí, la razón por la que los directorios mipmap a veces se usan para los íconos del iniciador se debe a que los scripts de compilación (aapt --preferred-configurations) eliminan los directorios dibujables- {densidad} pero no los directorios mipmap- {densidad}. Casi parece explotar un error, pero su cita de la publicación de Romain Guy y Diane Hackborn en plus.google.com/105051985738280261832/posts/QTA9McYan1L muestra que es por diseño.
Kevin TeslaCoil
3
así que mi proceso típico de eliminar mipmap, colocar mis íconos en dibujables y crear un solo APK es perfecto. Parece que mipmap es atípico para la mayoría de los desarrolladores, pero nos obliga a todos.
Alguien en algún lugar
En la documentación dice: "mipmap: archivos dibujables para diferentes densidades de iconos de iniciador". developer.android.com/guide/topics/resources/…
actividad
79

Parece que Google ha actualizado sus documentos desde todas estas respuestas, así que espero que esto ayude a alguien más en el futuro :) Acabo de encontrar esta pregunta yo mismo, al crear un nuevo (nuevo nuevo) proyecto.

TL; DR: los elementos extraíbles pueden eliminarse como parte de la optimización de recursos específicos de dp. Mipmaps no se eliminarán.

Las diferentes aplicaciones de inicio de la pantalla de inicio en diferentes dispositivos muestran los íconos de inicio de la aplicación en varias resoluciones. Cuando las técnicas de optimización de recursos de la aplicación eliminan recursos para densidades de pantalla no utilizadas, los íconos del iniciador pueden terminar viéndose borrosos porque la aplicación del iniciador tiene que escalar un ícono de menor resolución para mostrar. Para evitar estos problemas de visualización, las aplicaciones deben usar las mipmap/carpetas de recursos para los iconos del iniciador. El sistema Android conserva estos recursos independientemente de la eliminación de densidad, y garantiza que las aplicaciones de inicio puedan elegir iconos con la mejor resolución para mostrar.

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

Kazuaki
fuente
2
Esto es coherente con la ubicación predeterminada de Android Studio al importar activos de imagen. Los íconos del iniciador van a mipmap; otros entran en dibujables.
Edward Brey
2
La documentación parece haber cambiado nuevamente, mipmap no parece existir dentro de developer.android.com/tools/projects/index.html (a pesar de que otros fragmentos de documentación de Android todavía intentan hacer referencia a ella).
SomeoneElse
28

¿En qué se diferencian estas imágenes mipmap de las otras imágenes dibujables familiares?

Aquí están mis dos centavos al tratar de explicar la diferencia. Hay dos casos con los que trata cuando trabaja con imágenes en Android:

  1. Desea cargar una imagen para la densidad de su dispositivo y la va a usar "tal cual", sin cambiar su tamaño real . En este caso, debe trabajar con elementos extraíbles y Android le dará la mejor imagen de ajuste.

  2. Desea cargar una imagen para la densidad de su dispositivo, pero esta imagen se ampliará o disminuirá . Por ejemplo, esto es necesario cuando desea mostrar un icono de iniciador más grande, o si tiene una animación, que aumenta el tamaño de la imagen. En tales casos, para garantizar la mejor calidad de imagen, debe colocar su imagen en la carpeta mipmap . Lo que Android hará es que intentará recoger la imagen de un cubo de mayor densidad en lugar de ampliarla. Esto aumentará la nitidez (calidad) de la imagen.

Por lo tanto, la regla general para decidir dónde colocar su imagen sería:

  • Los íconos del iniciador siempre van a la carpeta mipmap .
  • Las imágenes, que a menudo se amplían (o se reducen extremadamente) y cuya calidad es crítica para la aplicación, también entran en la carpeta mipmap .
  • Todas las demás imágenes son dibujos usuales .
sergej shafarenka
fuente
Entonces, ¿los íconos para la barra de acción o el ícono para el botón flotante van en mipmap?
Juan De la Cruz
No, son sorteos habituales.
sergej shafarenka
23

La implementación de Android de mipmaps en 4.3 es exactamente la técnica de 1983 explicada en el artículo de Wikipedia :)

Cada imagen de mapa de bits del conjunto de mapas MIP es un duplicado reducido de la textura principal, pero con un cierto nivel de detalle reducido. Aunque la textura principal se seguiría utilizando cuando la vista sea suficiente para representarla con todo detalle, el renderizador cambiará a una imagen de mapa MIP adecuada (...) cuando la textura se vea desde una distancia o en un tamaño pequeño.

Aunque esto se describe como una técnica para gráficos en 3D (ya que menciona "visualización desde una distancia"), se aplica igualmente a 2D (traducido como "dibujado es un espacio más pequeño", es decir, "reducido").

Para un ejemplo concreto de Android, imagine que tiene una Vista con cierto fondo dibujable (en particular, a BitmapDrawable). Ahora usa una animación para escalarla a 0.15 de su tamaño original. Normalmente, esto requeriría reducir el mapa de bits de fondo para cada cuadro. Sin embargo, esta reducción "extrema" puede producir artefactos visuales.

Sin embargo, puede proporcionar un mapa MIP, lo que significa que la imagen ya está renderizada previamente para algunas escalas específicas (digamos 1.0, 0.5 y 0.25). Cada vez que la animación "cruza" el umbral de 0.5, en lugar de continuar reduciendo la escala de la imagen original de tamaño 1.0, cambiará a la imagen 0.5 y reducirá la escala, lo que debería proporcionar un mejor resultado. Y así sucesivamente a medida que la animación continúa.

Esto es un poco teórico, ya que en realidad lo hace el renderizador. Según la fuente de la clase Bitmap, es solo una pista, y el procesador puede o no honrarla.

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

Sin embargo, no estoy muy seguro de por qué esto sería especialmente adecuado para los iconos de aplicaciones. Aunque Android en tabletas, así como en algunos lanzadores (por ejemplo, GEL), solicite un icono de "una densidad más alta" para mostrarlo más grande, se supone que esto se debe hacer utilizando el mecanismo regular (es decir drawable-xxxhdpi, & c).

matiash
fuente
Esto realmente no explica la diferencia de las drawablecarpetas que también contienen imágenes mipmapped.
Timmmm
2
De hecho, esta respuesta es completamente errónea. La única diferencia es si los archivos están despojados o no: no tiene nada que ver con si se utiliza o no mipmapping (lo es en ambos casos). La carpeta está mal nombrada; probablemente deberían haberlo llamado drawable-nostripo algo así.
Timmmm
2
Buena explicación de los mapas MIP, pero la respuesta de Kazuaki refiriéndose a una entrada de un documento de Google parece implicar que en realidad no es la razón.
Trilarion
11

Una cosa que mencioné en otro hilo que vale la pena señalar: si está creando diferentes versiones de su aplicación para diferentes densidades, debe conocer el directorio de recursos "mipmap". Esto es exactamente como los recursos "extraíbles", excepto que no participa en la eliminación de densidad al crear los diferentes objetivos apk.

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

kreker
fuente
... sí, como mencionó Kevin en la respuesta aceptada. Esta parece haber sido la razón principal detrás de esto.
Richard Le Mesurier
@RichardLeMesurier sí, solo para hacerlo breve y claro
kreker
4

Como estaba buscando una respuesta aclaratoria para determinar el tipo correcto de íconos de notificación, me gustaría agregar esta declaración clara al tema. Es de http://developer.android.com/tools/help/image-asset-studio.html#saving

Nota: Los archivos de íconos de inicio residen en una ubicación diferente a la de otros íconos. Se encuentran en la carpeta mipmap /. Todos los demás archivos de iconos residen en la carpeta dibujable / de su proyecto.

Stev
fuente
2

Al construir aplicaciones separadas para diferentes densidades, se eliminan las carpetas dibujables para otras densidades. Esto hará que los íconos aparezcan borrosos en los dispositivos que usan íconos de inicio de mayor densidad. Como las carpetas mipmap no se eliminan, siempre es mejor usarlas para incluir los íconos del iniciador.

Fartab
fuente
2

Hay dos casos con los que trata cuando trabaja con imágenes en Android:

  1. Desea cargar una imagen para la densidad de su dispositivo y la va a usar "tal cual", sin cambiar su tamaño real. En este caso, debe trabajar con elementos extraíbles y Android le dará la mejor imagen de ajuste.
  2. Desea cargar una imagen para la densidad de su dispositivo, pero esta imagen se ampliará o disminuirá. Por ejemplo, esto es necesario cuando desea mostrar un icono de iniciador más grande, o si tiene una animación, que aumenta el tamaño de la imagen. En tales casos, para garantizar la mejor calidad de imagen, debe colocar su imagen en la carpeta mipmap. Lo que Android hará es que intentará recoger la imagen de un cubo de mayor densidad en lugar de ampliarla.

ENTONCES

Por lo tanto, la regla general para decidir dónde colocar su imagen sería:

  1. Los íconos del iniciador siempre van a la carpeta mipmap.

  2. Las imágenes, que a menudo se amplían (o se reducen extremadamente) y cuya calidad es crítica para la aplicación, también entran en la carpeta mipmap.

  3. Todas las demás imágenes son dibujos usuales.

Cita de este artículo.

Hayk Nahapetyan
fuente
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 para el ícono de la aplicación para el iniciador

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
fuente
¡Gracias por esa segunda publicación de blog! Aclara la diferencia entre el uso drawable-XXXy las mipmap-XXXcarpetas realmente bien: el ícono del iniciador es diferente a otros recursos ya que es posible que se muestre un ícono de mayor resolución en el iniciador de usuarios. Si esa imagen de mayor resolución ha sido eliminada de su carpeta de dibujables, entonces un icono de menor densidad se ampliará mediante programación. Esto puede causar un icono borroso poco atractivo.
winklerrr
Al menos en Android 8.1 en Nexus P6, los iconos de inicio en las carpetas dibujables NO ESTÁN A mayor escala. En realidad no se encuentra en absoluto y la aplicación se bloquea al abrirse.
Mateo
1

Si crea un APK para una resolución de pantalla de destino como HDPI, la herramienta de empaquetado de activos de Android, AAPT, puede eliminar los elementos extraíbles para otra resolución que no necesite. Pero si está en la carpeta mipmap, estos activos permanecerán en el APK, independientemente de la resolución de destino.

Evan
fuente
-1

La comprensión que tengo sobre mipmap es más o menos así:

Cuando se necesita dibujar una imagen, dado que tenemos diferentes tamaños de pantalla con resoluciones, tendrá que tomar parte una escala.

Si tiene una imagen que está bien para un teléfono celular de gama baja, cuando la escala al tamaño de una tableta de 10 ", debe" inventar "píxeles que realmente no existen. Esto se hace con algún algoritmo de interpolación. A mayor cantidad de píxeles que deben inventarse, más tiempo demora el proceso y la calidad comienza a fallar. La mejor calidad se obtiene con algoritmos más complejos que toman más tiempo (promedio de píxeles circundantes versus copiar el píxel más cercano, por ejemplo).

Para reducir la cantidad de píxeles que deben inventarse, con mipmap proporciona diferentes tamaños / soluciones de la misma imagen, y el sistema elegirá la imagen más cercana a la resolución que debe renderizarse y hará la escala desde allí. Esto debería reducir el número de píxeles inventados, ahorrando recursos para ser utilizados en el cálculo de estos píxeles para proporcionar una imagen de buena calidad.

Leí sobre esto en un artículo que explica un problema de rendimiento en libgdx al escalar imágenes:

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

Juan
fuente