android - ICS 上的位图以错误的像素格式加载

标签 android drawable android-4.0-ice-cream-sandwich

我遇到了以下问题。当 Ice Cream Sandwich 上运行的应用程序从资源加载任何位图时,它可能会被错误地呈现,就好像它已被解码为与当前窗口格式不同的格式,没有应用抖动。但是,解码格式和窗口格式都已明确设置:

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

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

以下是 test app 的屏幕截图取自 this article在带有 ICS 4.0.3 的模拟器上运行(它在 HTC HD2 上给出相同的结果):

RGBA_8888 (32-bits) 窗口格式,各种位图解码格式: 32-bit window format

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

可以注意到几件事:

  • 不时考虑抖动标志;
  • ICS 的默认窗口格式似乎是 RGB_565
  • 唯一好看的渐变出现在 RGB_565 窗口格式RGBA_8888 位图解码格式

这个问题在这些问题中也有反射(reflect),但仍然没有找到解决方案:

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

Awful background image quality in Android

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

最佳答案

我可以肯定地向您保证,默认的窗口格式是 RGB888。这实际上是 Android 2.3 中的默认设置,此后一直没有更改。在这一点上,我会考虑弃用 RGB565 窗口,因为基本上所有当前设备都有 32bpp 显示器。

你说你也在 HTC HD2 上运行它,但由于没有官方版本,我会怀疑你得到的任何结果。

我认为模拟器可能仍会使用 16bpp 显示器,因此在这方面我不会依赖它的结果来完全匹配您通常在设备上看到的内容。

关于android - ICS 上的位图以错误的像素格式加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9097887/

相关文章:

android - 来自自定义属性的可绘制资源

Android + 线性布局上的 setDividerDrawable?

android - 由于设备方向更改,在调整 webView 大小时更改应用程序可见的背景颜色

javascript - 我无法获得在 android 10 api 29 或 api 30 上工作的 http 请求。但它确实适用于较低的 api

android - 如何在我的 android 应用程序中实现搜索框?

android - 使用 API 级别 22 使用 <complex.h> 中的函数时出现链接错误

android - Android 4.0.3 上的 NetworkOnMainThreadException

android - 如何使用android-ndk-r10d在windows上编译ffmpeg-2.5.3

android-studio - Android Studio:不支持文字下划线错误

android - TYPE_SYSTEM_OVERLAY 在 ICS 中检测触摸