Android IC上的位图加载的像素格式错误

Android IC上的位图加载的像素格式错误,android,drawable,android-4.0-ice-cream-sandwich,Android,Drawable,Android 4.0 Ice Cream Sandwich,我遇到了以下问题。当运行在冰激凌三明治上的应用程序从资源中加载任何位图时,它很可能会被错误地渲染,好像它已被解码为与当前窗口格式不同的格式,并且没有应用抖动。但是,解码格式和窗口格式都已明确设置: BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inPreferredConfig = Bitmap.Config.RGBA_8888; 及 以下是在带有ICS 4.0.3的Emulator上运行的屏幕截图(它在HTC H

我遇到了以下问题。当运行在冰激凌三明治上的应用程序从资源中加载任何位图时,它很可能会被错误地渲染,好像它已被解码为与当前窗口格式不同的格式,并且没有应用抖动。但是,解码格式和窗口格式都已明确设置:

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

以下是在带有ICS 4.0.3的Emulator上运行的屏幕截图(它在HTC HD2上给出了相同的结果):

RGBA_8888
(32位)窗口格式,各种位图解码格式:

RGB_565
(16位)窗口格式,各种位图解码格式:

可以注意到以下几点:

  • 不时不考虑抖动标志
  • ICS的默认窗口格式似乎是
    RGB_565
  • 唯一好看的渐变显示在
    RGB_565
    窗口格式和
    RGBA_8888
    位图解码格式下
这些问题中也报告了此问题,但仍然找不到解决方案:


问题是,如何在IC上处理所有这些格式,更准确地说,如何使IC加载具有
RGBA_8888
格式的位图,以及如何将窗口格式设置为
RGBA_8888
,以便正确显示这些位图?

演示应用程序有点奇怪。。。它有两个活动,都过滤启动器的意图,一个用于16bpp,一个用于32bpp。我不确定是什么决定了你启动应用程序时会选择哪一个

在ICS设备上按原样运行应用程序(Nexus S Running stock 4.0.3)会导致始终选择16bpp版本。如果从清单中删除16bpp活动声明,它将启动32bpp版本,这并不奇怪。我觉得很好。“抖动”选项在32bpp中没有效果,但这是意料之中的。。。抖动仅在显示表面深度低于图像深度时起作用


至于显示表面深度,我的理解是,窗口表面深度过去默认为16bpp,直到安卓3.0(蜂巢)时默认值悄悄地切换到32bpp。默认窗口格式始终可以通过覆盖。

我可以向您保证默认窗口格式是RGB888。这实际上是安卓2.3中的默认设置,自发布以来一直没有更改。在这一点上,我会考虑RGB565窗口,因为基本上所有的当前设备都有32 BPP显示。 你说你也在HTC HD2上运行这个,但是因为没有官方的版本,我会怀疑你在那里得到的任何结果


我认为emulator可能仍然使用16bpp显示,因此在这方面,我不会依赖其结果来精确匹配您在设备上通常看到的内容。

在这些条件下,emulator和设备之间是否存在差异?否,它们都显示相同的行为仿真器/设备的应用程序菜单中按下的图标决定启动哪个活动:该菜单中显示两个应用程序图标BitmapConfig和BitmapConfig32。所以,这个演示应用程序一切都很好,它给出了截图所示的结果:
setFormat(…)
不起作用。啊,当然。我已经习惯了从Eclipse运行,它可能会选择manifest.Yup,dl:ed中声明的第一个启动器处理活动。BitmapConfig.apk测试应用程序-RGB888&抖动在“正确的”ICS构建中运行良好。
getWindow().setFormat(PixelFormat.RGBA_8888);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);