2012-02-01 12 views
11

Encontré el siguiente problema. Cuando una aplicación que se ejecuta en Ice Cream Sandwich carga un mapa de bits desde recursos, es probable que se represente incorrectamente como si se hubiera descodificado para el formato, que difiere del formato de ventana actual, sin aplicar dither. Sin embargo, ambos, el formato de decodificación y el formato de la ventana se han establecido de forma explícita:Los mapas de bits en ICS se cargan con un formato de píxeles incorrecto

BitmapFactory.Options opts = new BitmapFactory.Options(); 
opts.inPreferredConfig = Bitmap.Config.RGBA_8888; 

y

getWindow().setFormat(PixelFormat.RGBA_8888); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER); 

Aquí son capturas de pantalla del test app tomado de this article se ejecuta en el emulador con el ICS 4.0.3 (que da los mismos resultados en HTC HD2):

RGBA_8888 (32-bits) formato ventana, diversos formatos de descodificación de mapa de bits: 32-bit window format

RGB_565 (16-bits) formato de la ventana, diversos formatos de descodificación de mapa de bits: 16-bit window format

Varias cosas podrían ser notados: bandera

  • El difuminado no se toma en cuenta de vez en cuando ;
  • El formato de ventana predeterminado para ICS parece ser RGB_565;
  • La única buena gradiente de aspecto aparece con RGB_565 formato ventana y RGBA_8888 formato de mapa de bits de decodificación .

Este problema también se ha informado en estas preguntas, pero todavía no hay solución se puede encontrar allí:

Gradient compatibility issue - ICS defaults to fewer colors than all the previous versions of Android

Awful background image quality in Android

La quistion es, cómo hacer frente a todos estos formatos en ICS, para ser más precisos, ¿cómo hacer que ICS cargue mapas de bits con el formato RGBA_8888 y cómo configurar el formato de ventana en RGBA_8888 para que estos mapas de bits se muestren correctamente?

+0

¿Hay alguna diferencia entre el emulador y el dispositivo en estas condiciones? –

+0

No, ambos muestran el mismo comportamiento –

Respuesta

6

Definitivamente puedo asegurarle que el formato de ventana predeterminado es RGB888. Esto fue hecho el predeterminado en Android 2.3, y no ha sido cambiado desde ellos. En este punto, consideraría las ventanas RGB565 obsoletas, ya que básicamente todos los dispositivos actuales tienen pantallas de 32bpp.

Dice que también está ejecutando esto en el HTC HD2, pero dado que no hay una versión oficial para él, sospecho de cualquier resultado que obtenga allí.

Creo que el emulador aún puede usar pantallas de 16bpp, por lo que en esta área no confiaría en que sus resultados coincidan exactamente con lo que normalmente verá en los dispositivos.

+0

Sí, dl: ed la aplicación de prueba BitmapConfig.apk: RGB888 y dithering funcionan bien en una compilación de ICS "adecuada". – Jens

0

Esa aplicación de demostración es un poco extraña ... tiene dos actividades que filtran el intento del iniciador, una destinada a 16bpp y otra para 32bpp. No estoy seguro de qué determina cuál se selecciona al iniciar la aplicación.

Ejecutar la aplicación tal como está en un dispositivo ICS (un Nexus S Running Stock 4.0.3) da como resultado que siempre se elija la versión de 16bpp. Si elimina la declaración de actividad de 16bpp del manifiesto, en su lugar, lanza la versión de 32bpp. Lo cual me parece bien. La opción 'dither' no tiene efecto en 32bpp, pero eso es lo esperado ... el difuminado solo entra en juego cuando la profundidad de la superficie de la pantalla es inferior a la profundidad de la imagen.

En cuanto a las profundidades de la superficie de la pantalla, entiendo que la profundidad de la superficie de la ventana solía ser de 16bpp por defecto, hasta Android 3.0 (Honeycomb) y el valor predeterminado cambiaba silenciosamente a 32bpp. El valor predeterminado siempre ha sido anulable a través de Window.setFormat().

+0

El icono que presiona en el menú de la aplicación del emulador/dispositivo es lo que determina qué actividad se inicia: aparecen dos iconos de aplicación en ese menú, BitmapConfig y BitmapConfig32. Por lo tanto, todo está bien con esta aplicación de demostración, y proporciona exactamente los resultados que se muestran en las capturas de pantalla: 'setFormat (..)' no hace su trabajo. –

+0

Ah, por supuesto. Estoy tan acostumbrado a correr desde Eclipse, que presumiblemente selecciona la primera actividad de manejo del lanzador declarada en el manifiesto. –

Cuestiones relacionadas