完全に透明な背景を持つPNGを備えたImageViewの下のシェーディングアーティファクト
-
28-10-2019 - |
質問
ジンジャーブレッド(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に表示されませんでした