Android:PNG透明度失败BitmapFactory.decodeStream(...)和资产文件夹

时间:2012-02-01 07:03:53

标签: android png transparency transparent bitmapfactory

我正在使用以下方法从我的Android应用程序中的assets文件夹中提取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图像放在drawable文件夹中并按如下方式设置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;
        }
    }

但这给了我同样糟糕的结果。

任何想法,任何人?

谢谢。

2 个答案:

答案 0 :(得分:0)

相反,请尝试:

ImageView img=new ImageView(this);
        Drawable d = Drawable.createFromStream(getAssets().open(path_in_assets), null);
        img.setImageDrawable(d);

答案 1 :(得分:0)

如果您的图片是由应用程序资源制作的,并且它位于res / drawable /而不是特定分辨率文件夹之一(例如res / drawable-hdpi)

android编译器正在优化PNG,因此透明像素变为白色(如果是GIFF文件则为黑色)

分辨率: 将你的PNG文件移动到res / drawable-hdpi或其他一个可绘制的文件夹,你应该没问题。