2011-05-13 20 views
45

Si planea admitir LDPI, MDPI, HPDI y tal vez XHDPI en un futuro próximo, ¿está bien incluir solo XHDPI en el proyecto y dejar que los dispositivos los escalen a la resolución deseada?¿Solo usas XHDPI en la aplicación Android?

He probado para cambiar el tamaño de los dibujables en MDPI y HDPI en Photoshop y luego comparé el resultado con XHDPI solo redimensionado por Android, y no puedo ver ninguna diferencia en absoluto. ¿Es mal diseño tomar este atajo? Sería bueno no tener que cambiar el tamaño de cada dibujable en 3 resoluciones diferentes.

Planear el uso del SDK de destino es 2.1 o 2.2.

BR Emil

+2

Los activos finales de escalado de mapa de bits se verán mucho peor que los activos dibujan en tamaño en Photoshop utilizando capas de formas/estilos de capa, etc. Peor aún. Es mejor que cree imágenes con los tamaños correctos del documento original de Photoshop, siempre que el PSD tenga una buena construcción. –

Respuesta

25

supongo que es una buena manera de ir. El único inconveniente que se me ocurre es la sobrecarga de recursos en dispositivos de pequeña escala y posibles artefactos debido a la reducción de escala. En realidad, en el Google IO de este año, Chris Pruett recomendó incrustar solo activos de alta resolución y dejar que opengl maneje la escala.

+0

Es bueno saber esto. Ahora estoy desarrollando solo usando xhdpi drawables. ¿Hay alguna posibilidad de mejorar la calidad de las imágenes reducidas? Algún buen método de interpolación podría ser genial. –

+0

Puede habilitar el mipmapping para que el sistema cree versiones de diferentes tamaños de texturas a la vez que selecciona las mejores según la distancia de visualización. Esto aumenta la velocidad de renderizado y disminuye los artefactos. Para obtener más información, consulte http://en.wikipedia.org/wiki/Mipmap –

+11

La cita sobre Chris Pruett es un poco engañosa, ya que se trataba de juegos en los que dejaría que la GPU redujera la escala. – Warpzit

2

XHDPI solo se introdujo en Android SDK API Level 9 (Gingerbread) (consulte http://developer.android.com/reference/android/util/DisplayMetrics.html#DENSITY_XHIGH), por lo que si planea tener un SDK mínimo de menos de 9 también deberá proporcionar, al menos, HDPI imprimibles. los dispositivos con Froyo o inferior no mostrarán nada.

Actualización: En realidad, parece que las versiones anteriores a pan de jengibre mostrará xhdpi imágenes: https://groups.google.com/d/msg/android-developers/yjYO91OmoJ4/v3he0ZbKo-UJ

2

Está bien tener sólo los recursos xhdpi. Pero tenga en cuenta que xhdpi se introdujo con api nivel 9 (pan de jengibre). Es decir, si apuntas a los niveles de api < = 8, necesitas al menos también recursos de hdpi.

15

A partir de Android 1.6, se manejan diferentes densidades, incluyendo XHDPI (que no se agregó oficialmente hasta 2.2). Su aplicación primero buscará una imagen que coincida con su densidad, pero puede buscar en "cubos" más grandes como XHDPI y luego realizar la escala por usted.

Lo mejor es incluir activos específicos para las densidades que desea admitir. Una imagen de 100x100 toma 40kb; e imagen que es 200x200 toma 160k (sin comprimir). Por lo tanto, todos los recursos XHDPI utilizados en dispositivos MDPI tienen cuatro veces la cantidad de datos que necesita, que deben manejarse cuando se inicia la aplicación y se preparan sus recursos. Un menor uso de la memoria significa una mayor eficiencia, menos posibilidades de una OutOfMemoryException.

Además, los tipos específicos de imágenes se verán mal al escalar automáticamente. En particular, las imágenes con líneas finas o patrones finos tendrán sus detalles embarrados. Cuando reduce las imágenes a mano, puede elegir el algoritmo que mejor se adapte a sus necesidades (lineal, bicúbico, lanczos, etc.).

Si usted está preocupado por el tiempo que se necesita para hacer el cambio de tamaño a sí mismo, se puede incorporar un proceso por lotes o utilizar herramientas tales como composición de nueve Resizer: http://code.google.com/p/9patch-resizer/

+0

La siguiente afirmación es falsa: "Android 2.1 no conocía los recursos de XHDPI, por lo que se bloqueará cuando el código intente usar un recurso solo de XHDPI en las versiones 2.1 y anteriores". Nunca he experimentado un bloqueo debido a la falta de gráficos que no sean xhdpi. –

+0

Parece que 1.6 y superior manejarán los activos XHDPI; Actualizaré la respuesta. –

+0

Siempre asumí que funcionó debido a la construcción de la aplicación en un nivel de SDK más alto, y que la lógica para seleccionar gráficos se produce en la lógica suministrada. ¿Hay alguna documentación formal sobre esto? –

4

he probado en una aplicación sencilla (desarrollar para Android 2.1) usando solo imágenes xhdpi y funciona bien en resoluciones pequeñas, medianas y altas ... incluso probé en un Android 2.1 (resolución pequeña) y abre la imagen sin problemas.

Tal vez la cosa con la memoria es verdadera, por lo que es necesario que alguien pruebe esto.

3

Personalmente encontré que usar solo la carpeta xhdpi funciona bastante bien en muchas aplicaciones y soy un gran partidario de este enfoque. En la sobrecarga de la memoria es cierto, pero con los dispositivos de hoy lo consideraría insignificante.También creo que hay algo de almacenamiento en caché después de la reducción de escala ya que nunca noté ninguna ralentización debido a esto. Incluir solo una carpeta puede reducir drásticamente el tamaño de su APK que los usuarios finales apreciarán bastante. Debes tener en cuenta que algunas imágenes obtendrán artefactos de escalado (patrones finos y demás) pero personalmente nunca me encontré con nada crítico en mis aplicaciones. También para botones y cosas, asegúrese de usar 9 parches para reducir los artefactos en las esquinas redondeadas, incluso puede reducir ligeramente el tamaño de la imagen utilizando este enfoque. El nivel de API no será un problema en versiones anteriores, ya que creo que drawable-xhdpi se considera simplemente dibujable en versiones que no lo admiten. No ignore las posibilidades de definir algunos dibujos simples en xml, por ejemplo, es muy fácil crear un fondo degradado con formas simples y con esto ahorra espacio y no se arriesga a escalar artefactos.

+3

Aviso a los votantes a favor, vote si cree que esta respuesta es correcta, pero por favor agregue algunas explicaciones por las que piensa así. Esto se debe a que esta respuesta se basa en opiniones personales y de esta forma resolví que el problema funcionaba perfectamente todo el tiempo. También hay otros desarrolladores que utilizan este enfoque y creo que también les gustaría saber por qué esto podría ser una mala práctica si lo crees. – PSIXO

0

Esta afirmación sobre el uso de memoria adicional es incorrecta.

Si coloca XHDPI tamaños dibujables dentro de la carpeta MDPI, entonces tendrá problemas de memoria.

Pero si proporciona XHDPI carpeta arrastrable dentro de la carpeta XHDPI, no se utilizará ninguna memoria adicional ya que Android reduce las imágenes omitiendo partes de la misma.

Este skipping es la razón por la cual debe proporcionar productos aptos para todas las densidades que planea admitir para que se vean bien.

Por otro lado, solo ciertas imágenes se verán mal cuando se muestrean de forma descendente (principalmente íconos pequeños) de forma que, siempre que la imagen tenga suficientes datos para descartar, se verá bien. O imagine si tiene una cuadrícula como dibujable, de modo que algunas líneas de la cuadrícula se pueden descartar y la imagen se verá mal.

Al final, es mejor para usted experimentar con diferentes dispositivos, entonces puede ver qué drawales necesitan recursos alternativos para su densidad.

+2

¿De modo que Android es lo suficientemente inteligente como para no leer toda la imagen en la memoria antes de realizar el muestreo descendente? Si se salta los píxeles, solo hace el muestreo del vecino más cercano? Cita requerida – Karu

+0

Yo también encuentro extraño que salten los píxeles, creo que usan algún otro algoritmo pero podrían estar equivocados, alguna fuente sería genial. Aún así, probablemente no tendrá que preocuparse por la memoria, ya que los datos de mapas de bits se administrarán en la memoria nativa, no en el almacenamiento en java, e incluso en los dispositivos de gama baja, tendrá memoria más que suficiente incluso para imágenes de gran tamaño. – PSIXO

Cuestiones relacionadas