2012-02-01 15 views
11

次の問題が発生しました。 Ice Cream Sandwich上で実行されているアプリケーションによってリソースからビットマップがロードされると、ディザが適用されていない現在のウィンドウ形式とは異なる形式にデコードされたように誤ってレンダリングされる可能性があります。しかし、復号形式とウィンドウ形式の両方が明示的に設定されています。ここではICSのビットマップが間違ったピクセル形式でロードされています

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

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

はICS 4.0.3でエミュレータ上で実行されているthis articleから取られた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上で正確には、RGBA_8888形式でICSロードビットマップを作成する方法と、これらのビットマップが正しく表示されるようにウィンドウ形式をRGBA_8888に設定する方法はありますか?

+0

これらの条件下で、エミュレータとデバイスに違いはありますか? –

+0

いいえ、どちらも同じ動作を示します –

答えて

6

デフォルトのウィンドウ形式がRGB888であることは間違いありません。これは実際にAndroid 2.3ではデフォルトになっていて、それ以来変更されていません。この時点では、基本的に現在のすべてのデバイスに32bppのディスプレイがあるので、私はRGB565のウィンドウを非推奨と考えています。

あなたはHTC HD2でもこれを実行していると言いますが、正式なビルドはないので、そこに到達した結果は疑わしいでしょう。

私はエミュレータがまだ16bppディスプレイを使用している可能性があるので、この領域ではデバイスに通常表示されるものと正確に一致するようにその結果に依存しません。

+0

いいえ、dl:BitmapConfig.apkテストアプリ - RGB888とディザリングは、「適切な」ICSビルドでうまく機能します。 – Jens

0

デモアプリケーションはちょっと奇妙です...ランチャーの意図をフィルタリングする2つのアクティビティがあります.1つは16bpp用、もう1つは32bpp用です。あなたがアプリを起動するときにどれが選択されるかを決定するものが不明です。

ICSデバイス(Nexus Sランニングストック4.0.3)でそのままアプリを実行すると、常に16bppバージョンが選択されます。マニフェストから16bppアクティビティ宣言を削除すると、意外にも32bppバージョンが起動されます。それは私にはうまく見える。 'ディザ'オプションは32bppでは効果がありませんが、それは期待どおりです...ディザリングは、ディスプレイの表面の深さが画像の深さよりも低い場合にのみ始まります。

ディスプレイの表面の深さについては、私の理解は、デフォルトの静かに32bppに切り替えた時点で、Android 3.0(Honeycomb)まで16bppにデフォルトするために使用されたウィンドウの表面の深さです。デフォルトは常にWindow.setFormat()でオーバーライド可能です。

+0

エミュレータ/デバイスのアプリケーションメニューで押すアイコンは、起動するアクティビティを決定するものです。そのメニューに2つのアプリケーションアイコン、BitmapConfigとBitmapConfig32が表示されます。したがって、このデモアプリケーションではすべてが問題なく、スクリーンショットに示されているようにこれらの結果を正確に示します。 'setFormat(..)'はその仕事をしません。 –

+0

もちろん、ああ。おそらくマニフェストで宣言された最初のランチャー処理アクティビティを選択するEclipseから実行するのに慣れています。 –

関連する問題