Mipmap drawables para los iconos

Desde Android 4.3 ahora podemos hacer uso de res/mipmap carpetas res/mipmap para almacenar imágenes "mipmap".

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

¿Cómo son estas imágenes mipmap diferentes 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 API de Android 4.3 tiene lo siguiente:

El uso de un mipmap como fuente para su mapa de bits o dibujable es una forma sencilla de proporcionar una imagen de calidad y varias escalas de imagen, lo que puede resultar especialmente útil si espera que su imagen sea escalada durante una animación.

Android 4.2 (API nivel 17) añadió soporte para mipmaps en la clase Bitmap-Android intercambia las imágenes mip en su mapa de bits cuando ha proporcionado una fuente mipmap y ha habilitado setHasMipMap (). Ahora en Android 4.3, también puedes habilitar mipmaps para un objeto BitmapDrawable, proporcionando un activo mipmap y estableciendo el atributo android: mipMap en un archivo de recursos de mapa de bits o llamando a hasMipMap ().

¿No veo nada que me ayude a entender?


Los recursos XML de mapa de bits tienen una propiedad android:mipMap :

Booleano Activa o desactiva la sugerencia mipmap. Consulte setHasMipMap () para obtener más información. El valor predeterminado es false.

Esto no se aplica a los iconos del lanzador hasta donde puedo ver.


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

Es útil proporcionar una imagen con una resolución mayor que normalmente se calcularía (por ejemplo, en un dispositivo mdpi, es posible que el Lanzador desee que el icono de hdpi más grande muestre accesos directos de aplicaciones grandes).

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

Todavía estoy inclinado a ir con el seguimiento de Randy Sugianto:

¿Cuáles son las ventajas de esto? ¿Hay alguna guía de cómo utilizar mipmaps, probablemente para mejores iconos de lanzador?


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 referirme a la implementación actual de Android.


¿Deberíamos almacenar todos nuestros iconos de aplicaciones en carpetas res/mipmap estos días y cuáles son las directrices para estas imágenes de mipmap?


Actualización # 1

Aquí hay una entrada en un blog que trata de explicarlo un poco.

  • Mipmapping para drawables en Android 4.3

Pero la imagen utilizada en ese blog muestra lo que parece un archivo con muchos logo en él. Esto no es lo que veo en la carpeta mipmap de Chrome.

La carpeta mipmap-hdpi contiene 3 imágenes. Uno es el logotipo de Chrome, por sí solo.

Chrome mipmap-hdpi icon.png

Curiosamente, es 72×72, no 48×48 que esperaría ver.

Tal vez eso es todo lo que hay para esto – sólo tenemos que mantener los iconos más grandes en las carpetas mipmap?


Actualización # 2

La publicación de Android Developers Blog de 23/10/2014 confirma de nuevo la idea de utilizar mipmap carpetas mipmap para los iconos de las aplicaciones:

  • Preparación de las aplicaciones para Nexus 6 y Nexus 9

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

Es recomendable colocar los iconos de las aplicaciones en las carpetas mipmap (no en las carpetas dibujables) porque se utilizan en resoluciones diferentes de la densidad actual del dispositivo. Por ejemplo, un icono de aplicación xxxhdpi se puede utilizar en el lanzador para un dispositivo xxhdpi.


Actualización # 3

Tenga en cuenta que Android Studio crea los iconos ic_launcher.png en el mipmap... carpetas en lugar de las drawable... carpetas que Eclipse utilizó para crearlas.


Hay dos usos distintos de mipmaps.

1) Para los iconos del lanzador al construir la densidad específica APKs. Algunos desarrolladores crean APKs separados para cada densidad, para mantener el tamaño de APK abajo. Sin embargo, algunos lanzadores (enviados con algunos dispositivos o disponibles en la Play Store) utilizan tamaños de icono mayores que los 48dp estándar. Los lanzadores usan getDrawableForDensity y se reducen si es necesario, en lugar de subir, por lo que los iconos son de alta calidad. Por ejemplo, en una tableta hdpi, el lanzador podría cargar el icono xhdpi. Colocando su icono del lanzador en el directorio del mipmap-xhdpi, no será pelado la manera un directorio drawable-xhdpi es al construir un APK para los dispositivos del hdpi. Si está construyendo un solo APK para todos los dispositivos, entonces esto realmente no importa, ya que el lanzador puede acceder a los recursos desplegables 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 Open Source Project de Android y no soy consciente de ningún otro lanzador usando.

Parece que Google ha actualizado sus documentos ya que todas estas respuestas, por lo que espero que esto ayudará a alguien en el futuro 🙂 Sólo se encontró con esta pregunta a mí mismo, mientras que la creación de un nuevo proyecto (nuevo).

TL; DR: los drawables pueden ser eliminados como parte de la optimización de recursos específicos de dp. Mipmaps no será despojado.

Las diferentes aplicaciones del lanzador de pantalla de inicio en diferentes dispositivos muestran los iconos del lanzador de aplicaciones en varias resoluciones. Cuando las técnicas de optimización de recursos de la aplicación eliminan recursos para las densidades de pantalla no utilizadas, los iconos del lanzador pueden aparecer borrosos porque la aplicación de lanzador tiene que escalar un icono de resolución más baja para mostrarlo. Para evitar estos problemas de visualización, las aplicaciones deben utilizar mipmap/ carpetas mipmap/ resource para los iconos del lanzador. El sistema Android preserva estos recursos independientemente de la densidad de eliminación y garantiza que las aplicaciones de lanzamiento pueden seleccionar los iconos con la mejor resolución para su visualización.

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

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 mipmap es un duplicado reducido de la textura principal, pero a un cierto nivel de detalle reducido. Aunque la textura principal seguirá siendo utilizada cuando la vista sea suficiente para representarla en detalle, el renderizador cambiará a una imagen mipmap 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 los gráficos en 3D (ya que menciona "ver desde una distancia"), se aplica igual de bien a 2D (traducido como "dibujado es un espacio más pequeño", es decir, "reducido a escala").

Para un ejemplo concreto de Android, imagina que tienes una Vista con un determinado fondo dibujable (en particular, un BitmapDrawable ). Ahora usa una animación para escalarla a 0.15 de su tamaño original. Normalmente, esto requeriría downscaling el mapa de bits de fondo para cada marco. Esta reducción de escala "extrema", sin embargo, puede producir artefactos visuales.

Sin embargo, puede proporcionar un mipmap, lo que significa que la imagen ya está pre-renderizada 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 vez de continuar bajando la escala de la imagen original de tamaño 1.0, cambiará a la imagen 0,5 y la degradará, lo que debería proporcionar un mejor resultado. Y así sucesivamente mientras la animación continúa.

Esto es un poco teórico, ya que en realidad es hecho por el renderizador. De acuerdo con la fuente de la clase Bitmap, es sólo una pista, y el renderizador puede o no puede honrarlo.

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

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

¿Cómo son estas imágenes mipmap diferentes de las otras imágenes dibujables familiares?

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

  1. Desea cargar una imagen para la densidad de su dispositivo y lo va a usar "tal cual" sin cambiar su tamaño real . En este caso usted debe trabajar con drawables y Android le dará la mejor imagen apropiada.

  2. Desea cargar una imagen para la densidad del dispositivo, pero esta imagen se va a escalar hacia arriba o hacia abajo . Por ejemplo esto es necesario cuando se desea mostrar un icono de lanzador más grande, o si tiene una animación, lo 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 va a hacer es, tratará de recoger la imagen de un cubo de alta densidad en lugar de ampliarla. Esto aumentará la nitidez (calidad) de la imagen.

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

  • Los iconos del lanzador siempre entran en la carpeta mipmap .
  • Las imágenes, que a menudo se amplían (o se reducen a una escala muy pequeña) y cuya calidad es crítica para la aplicación, también se incluyen en la carpeta mipmap .
  • Todas las demás imágenes son dibujables habituales.

Una cosa que he mencionado en otro hilo que vale la pena señalar – si usted está construyendo versiones diferentes de su aplicación para diferentes densidades, debe saber sobre el directorio de recursos "mipmap". Esto es exactamente como los recursos "extraíbles", excepto que no participa en la reducción de densidad al crear los diferentes objetivos apk.

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

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

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

Hay dos casos que se tratan cuando se trabaja con imágenes en Android:

  1. Desea cargar una imagen para la densidad de su dispositivo y lo va a usar "tal cual" sin cambiar su tamaño real. En este caso usted debe trabajar con drawables y Android le dará la mejor imagen apropiada.
  2. Desea cargar una imagen para la densidad del dispositivo, pero esta imagen se va a escalar hacia arriba o hacia abajo. Por ejemplo esto es necesario cuando se desea mostrar un icono de lanzador más grande, o si tiene una animación, lo 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 va a hacer es, tratará de recoger la imagen de un cubo de alta densidad en lugar de ampliarla.

ASI QUE

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

  1. Los iconos del lanzador siempre entran en la carpeta mipmap.

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

  3. Todas las demás imágenes son dibujables habituales.

Cita de este artículo.

Si construyes un APK para una resolución de pantalla de destino como HDPI, la herramienta de paquete de activos de Android, AAPT, puede quitar los drawables para otra resolución que no necesites. Pero si está en la carpeta mipmap, estos activos permanecerán en el APK, independientemente de la resolución de destino.

Cuando se construyen apks independientes para diferentes densidades, se extraen carpetas desplegables para otras densidades. Esto hará que los iconos aparezcan borrosos en dispositivos que usan iconos de lanzador de mayor densidad. Dado que las carpetas mipmap no se desnudan, siempre es mejor usarlas para incluir los iconos del lanzador.

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

Cuando una imagen necesita ser dibujada, teniendo en cuenta que tenemos diferentes tamaños de pantalla son resoluciones, algunas escalas tendrán que tomar parte.

Si tienes una imagen que está bien para un teléfono celular de gama baja, al escalarla al tamaño de una tableta de 10 "tienes que" inventar "píxeles que en realidad no existen. Esto se hace con algún algoritmo de interpolación. Más cantidad de píxeles que tienen que ser inventados, más largo toma 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 pixles circundantes vs copiar el píxel más cercano, por ejemplo).

Para reducir el número de píxeles que se tienen que inventar, con mipmap se proporcionan diferentes tamaños / rsolutions de la misma imagen, y el sistema elegirá la imagen más cercana a la resolución que se tiene que renderizar y realizar la escala a partir de ahí. Esto debería reducir el número de píxeles inventados que ahorran recursos para ser utilizados en el cálculo de estos píxeles para proporcionar una imagen de buena calidad.

He leído 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

 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 icono de la aplicación para el lanzador

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/

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.