9

次の方法を使用して、Android アプリケーションのアセット フォルダーから PNG ファイルを取得しています。

public static Bitmap getBitmapFromAssets(Context context, String fileName) {
        try {
            AssetManager assetManager = context.getAssets();
            InputStream inputStream = assetManager.open(fileName);
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            return bitmap;
        }
        catch(Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

次に、GridView の項目で ImageView のソースをその Bitmap に設定しています。

問題のレイアウト XML は次のとおりです。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/containingLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:gravity="center_horizontal"
    android:background="@android:color/transparent"
    android:padding="0dp"
    android:layout_margin="0dp"
>
    <ImageView
        android:id="@+id/ivPackageIcon"
        style="@style/smLargeGridItemPackageIconStyle"
    />
</LinearLayout>

その XML で参照されているスタイルは次のとおりです。

<style name="smLargeGridItemPackageIconStyle">
        <item name="android:scaleType">fitXY</item>
        <item name="android:layout_width">100dp</item>
        <item name="android:layout_height">142dp</item>
        <item name="android:layout_margin">5dp</item>
        <item name="android:background">@android:color/transparent</item>
    </style>

ImageView のソースを設定するコードは次のとおりです。

ImageView ivPackageIcon = (ImageView)containingView.findViewById(R.id.ivPackageIcon);
        if(ivPackageIcon != null) {
            Bitmap coverImage = getBitmapFromAssets(containingView.getContext(), "myimage.png");
            ivPackageIcon.setImageBitmap(coverImage);
        }

PNG 画像には透明な領域がいくつかありますが、何らかの理由で画像を GridView に表示すると、透明な領域が黒くなります。

いくつかの質問に先んじて: いいえ、Activity、ImageView、GridView、および GridView アイテムの背景は黒ではありません。実際のところ、背景色がどのように設定されていても、画像の透明な部分は常に黒として表示されます。

ただし、これを考慮してください... PNG画像をドローアブルフォルダーに配置し、ImageViewを次のように設定すると、透明度は完璧になります:

ivPackageIcon.setImageResource(R.drawable.myimage);

どういうわけかdecodeStream(...)メソッドを間違って使用していると確信していますが、何が間違っているのかわかりません。ここに示すように、元の方法を変更していくつかのオプションを設定しました。

public static Bitmap getBitmapFromAssets(Context context, String fileName) {
        try {
            AssetManager assetManager = context.getAssets();
            InputStream inputStream = assetManager.open(fileName);

            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inDither = true;
            options.inPreferredConfig = Config.ARGB_8888;

            Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, options);
            return bitmap;
        }
        catch(Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

しかし、それは私に同じ悪い結果をもたらしました。

アイデアはありますか?

ありがとうございました。

4

2 に答える 2

0

画像がアプリケーション リソースから作成され、特定の解像度フォルダー (例: res/drawable-hdpi) の代わりに res/drawable/ に配置されている場合

Android コンパイラは PNG を最適化して、透明なピクセルが白 (または GIFF ​​ファイルの場合は黒) になるようにします。

解決策: PNG ファイルを res/drawable-hdpi または他のドローアブル フォルダーの 1 つに移動すれば問題ありません。

于 2015-03-31T12:56:43.007 に答える