完全に透明な背景を持つPNGを備えたImageViewの下のシェーディングアーティファクト

StackOverflow https://stackoverflow.com/questions/8386458

質問

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

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

BitMapを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ベースのアプライアンスが取り組んでいる)
2.透明なPNGを互いに上にレンダリングしながら、2.3.4および32BPPフレームバッファに特定の問題があります。

ありがとう。

役に立ちましたか?

解決

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

Skiaのブレンドブリット部分でネオンの最適化を削除すると(skblitrow_d32.cpp-- skblitrow :: proc32 skblitrow :: factory32(unsignedフラグ))、シェーディングアーティファクトが消えます。

この種のバグをデバッグしたい人にとって有用なヒント:
いつでもビュー階層をビットマップに描くことができます(参照: Androidは、描画する前にビューのビットマップを取得しますか? たとえば)を使用して使用します bitmap.compress ビットマップをPNGファイルにエクスポートする方法。このようにして、Alphaチャンネルでビューヒエラルキースナップショットを取得できます(構成後に生成されるため、DDMSスクリーンショットには表示されません)。このようにして、影付きの領域内のアルファ値が「0」ではなく「1」であることを知り、アーティファクトを作成しました。

他のヒント

単に設定します

BackButton.setBackgroundColor(Color.TRANSPARENT);

Android 2.3.5を使用したHTC Desire HDのImageButtonで私の問題を解決しました。ここで、ボタンの画像はデフォルトの背景よりも高さが少ない。経験的観察;アーティファクトは、Android 4.1.2のGalaxy Note1に表示されませんでした

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top