2012-02-01 47 views
11

我遇到以下問題。當運行在冰淇淋三明治上的應用程序從資源加載任何位圖時,它可能會被錯誤地渲染,就好像它已被解碼爲與當前窗口格式不同的格式,而不應用任何抖動。然而,兩者的解碼格式和窗口格式已明確設置:ICS上的位圖加載了錯誤的像素格式

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

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

下面是this article與ICS 4.0.3在模擬器中運行所採取的test app的截圖(它給上HTC HD2相同的結果):

RGBA_8888(32位)窗口格式,各種位圖解碼格式: 32-bit window format

RGB_565(16位)窗口格式,各種位圖解碼格式: 16-bit window format

幾件事情可以注意到:

  • 抖動標誌沒有被考慮不時;
  • ICS的默認窗口格式似乎是RGB_565;
  • 唯一好看梯度出現帶有RGB_565窗口格式RGBA_8888位圖解碼格式

這個問題也有報道這些問題,但仍然沒有解決方案可以在那裏找到:

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

Awful background image quality in Android

的quistion是,如何處理所有這些格式在ICS上,更準確地說,如何使ICS加載位圖格式爲RGBA_8888,以及如何將窗口格式設置爲RGBA_8888,以便這些位圖可以正確顯示?

+0

在這些條件下仿真器和設備是否有區別? – 2012-02-07 07:48:01

+0

不,它們都顯示相同的行爲 – 2012-02-07 08:31:24

回答

6

我絕對可以向你保證,默認的窗口格式是RGB888。這實際上是Android 2.3的默認設置,並且自從它們以來一直沒有改變。此時我會考慮使用RGB565窗口,因爲基本上所有當前設備都有32bpp顯示。

你說你也在HTC HD2上運行這個版本,但是因爲沒有官方版本,所以我會懷疑你得到的任何結果。

我認爲仿真器可能仍然使用16bpp顯示器,所以在這個領域我不會依賴它的結果來完全匹配你通常在設備上看到的結果。

+0

Yup,dl:編輯BitmapConfig.apk測試應用程序 - RGB888&dithering在「正確的」ICS構建中運行良好。 – Jens 2012-02-10 13:14:06

0

這個演示應用程序有點奇怪...它有兩個活動都過濾發射器的意圖,一個用於16bpp和一個用於32bpp。我不確定在啓動應用程序時決定選擇哪一個。

在ICS設備上運行應用程序(Nexus S運行庫存4.0.3)導致始終選擇16bpp版本。如果從清單中刪除16bpp活動聲明,則不會意外啓動32bpp版本。這對我來說看起來很好。 「抖動」選項在32bpp中沒有效果,但這是預期的......抖動僅在顯示錶面深度低於圖像深度時才起作用。

至於顯示錶面深度,我的理解是窗口表面深度默認爲16bpp,直到Android 3.0(Honeycomb),默認情況下默認切換到32bpp。默認值一直可以通過Window.setFormat()覆蓋。

+0

在模擬器/設備的應用程序菜單中按下的圖標決定了哪個活動已啓動:該菜單中出現兩個應用程序圖標BitmapConfig和BitmapConfig32。所以,這個演示應用程序的一切都很好,它給出了截圖中顯示的完全結果:'setFormat(..)'沒有完成它的工作。 – 2012-02-07 13:01:35

+0

當然啊。我很習慣從Eclipse中運行,這大概會選擇清單中聲明的​​第一個啓動程序處理活動。 – 2012-02-07 13:02:51