1

私はジンジャーブレッド(2.3.3)デバイスに取り組んでいます。矢印の図を含む ImageView があり、背景に描画する必要がある完全に透明な背景があります。問題は、ImageView の境界ボックスの下に「シェーディング」アーティファクトがあることです。
次の画像をよく見ると、私が話しているアーティファクトが表示されます: 1

前景画像と背景画像の両方にアルファ チャネルがあるため、ARGB8888 としてデコードされます (リソースを手動でビットマップにデコードし、ARGB8888 を示すビットマップ構成を出力して、それぞれのビューに割り当てて、これを再確認しました)。また、setContentView() を呼び出す前に、Activitiy のウィンドウを PixelFormat.RGBA_8888 に構成しました。

ビットマップを ARGB8888 としてデコードすることや、ウィンドウを RGBA_8888 に設定することを提案するスレッドを紹介しないでください。両方の解決策を試しましたが、役に立ちませんでした。

この問題を解決するにはどうすればよいですか?

編集:

ウィンドウのピクセル形式とドローアブルを設定する関数は次のとおりです (onCreate() から直接呼び出されます):

public void testTransparency() {
    getWindow().setFormat(PixelFormat.RGBA_8888);
    setContentView(R.layout.transparency_test);
    LinearLayout ll = (LinearLayout)findViewById(R.id.ll);      
    Bitmap bgBmp = BitmapFactory.decodeResource(getResources(), R.raw.bg);
    Log.d(TAG,"BG BMP Config: " + bgBmp.getConfig());
    ll.setBackgroundDrawable(new BitmapDrawable(bgBmp));
    ImageView iv = (ImageView)findViewById(R.id.iv);
    iv.setBackgroundDrawable(null);
    Bitmap arrowBmp = BitmapFactory.decodeResource(getResources(), R.raw.big_arrow);
    Log.d(TAG,"Arrow BMP Config: " + arrowBmp.getConfig());
    iv.setImageBitmap(arrowBmp);
}

そして、これが私のテストで使用している(非常に単純な)レイアウトです。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:id="@+id/ll"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:orientation="vertical"  
    android:gravity="center">

<ImageView android:id="@+id/iv"
    android:layout_width="72dp"
    android:layout_height="120dp"
    /></LinearLayout>

「bg」リソースは2
にあり ます。「big_arrow」リソースは「http://i.imgur.com/3V6QU.png」にあります。

編集 2:
エミュレーターでも、N1 (2.3.4) または XOOM (3.2.1) でも問題を再現できないことがわかりました。ここから続く 2 つのオプションがあります:
1. 問題はデバイス固有 (私が取り組んでいる Android ベースのアプライアンス) です

ありがとう。

4

2 に答える 2

1

バグが見つかりましたが、実際にはプラットフォーム固有のバグでした。

SKIA のブレンドされたブリッティング部分 ( SkBlitRow_D32.cpp - SkBlitRow::Proc32 SkBlitRow::Factory32(unsigned flags) ) でネオンの最適化を削除する と、シェーディング アーティファクトが消えることがわかりました。

この種のバグをデバッグしたい人にとって役立つヒント:
ビュー階層をいつでもビットマップに描画できます (参照: Android は、描画する前にビューのビットマップを取得しますか?など) 。Bitmap.compressメソッドを使用して、ビットマップを PNG ファイルに変換します。このようにして、ビュー階層のスナップショットをそのアルファ チャネルと共に取得できます (構成後に生成されるため、DDMS スクリーンショットには表示されません)。このようにして、影付きの領域内のアルファ値が「0」ではなく「1」になり、アーティファクトが作成されることがわかりました。

于 2011-12-13T10:12:39.700 に答える