ImageView中的图片透明部分变成黑色

21

在安卓 KitKat (Nexus 7) 中,我在显示带透明度的图片时遇到了问题,但在 Nexus 4 (KitKat) 和早期的 Android 操作系统中都没有问题,这是图片:

enter image description here

而 ImageView 的布局如下:

<ImageView
android:id="@+id/avatar"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="21dp"
android:padding="3dp"
android:src="@drawable/icon_button_profile_new"
android:tag="@string/avatar" />

这里是在Nexus 7(Android 4.4)上运行时的截图: 输入图片描述

此外,我使用Picasso从URL下载和缓存图像。


1
你的背景是什么颜色? - Connecting life with Android
你可以将ImageView的背景颜色设置为透明。 - Siddharth_Vyas
1
@SiddharthVyas 我尝试过了,但它不起作用。 - hakim
这就是为什么你看到它是黑色的原因。按照需要设置背景颜色。如果你设置 android:background="@android:color/white" ,你将看到白色的背景。 - Connecting life with Android
似乎是位图格式的问题,可能是由于Picasso或其他组件将其设置为没有alpha通道的格式? - Thrakbad
显示剩余3条评论
3个回答

9

尝试了一些方法:首先我尝试将图像作为资源 drawable 使用,仍然会发生黑色替换透明部分的情况,其次,我将图像转换为 png 格式后它就能够正常工作,所以问题出在文件类型(gif)上。 由于在我的实际应用中,图像是从服务器获取的,我无法始终请求 png 格式的图像,因此我使用了来自此链接的解决方案:Transparent GIF in Android ImageView

对于仅显示一个图像的简单情况(就像在我的问题中一样),我使用 Picasso,并使用 target 来消除��像黑色替换透明的颜色,代码如下:

target = new Target() {         
@Override
public void onPrepareLoad(Drawable arg0) {

}

@Override
public void onBitmapLoaded(Bitmap bitmap, LoadedFrom arg1) {
    if (Build.VERSION.SDK_INT == 19/*Build.VERSION_CODES.KITKAT*/){
        Bitmap editedavatar = AndroidUtils.eraseColor(bitmap, -16777216);
        avatar.setImageBitmap(editedavatar);
    }
}

@Override
public void onBitmapFailed(Drawable arg0) {
    avatar.setImageResource(R.drawable.ic_profile_default);

erase color 是一个静态方法

public static Bitmap eraseColor(Bitmap src, int color) {
    int width = src.getWidth();
    int height = src.getHeight();
    Bitmap b = src.copy(Config.ARGB_8888, true);
    b.setHasAlpha(true);

    int[] pixels = new int[width * height];
    src.getPixels(pixels, 0, width, 0, 0, width, height);

    for (int i = 0; i < width * height; i++) {
        if (pixels[i] == color) {
            pixels[i] = 0;
        }
    }

    b.setPixels(pixels, 0, width, 0, 0, width, height);

    return b;
}

但是由于我在ListView中使用了Picasso来显示图像,所以我在ViewHolder中实现了Target,到目前为止它运作得非常好。


6
我遇到过类似的问题,通过添加 b.setHasAlpha(true); 解决了它。这可能是关键的一行代码... 很棒! - osolmaz
这个东西去掉了纯黑色,但不会触及半黑色。 - fnc12

1
Try this
<ImageView
android:id="@+id/avatar"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="21dp"
android:padding="3dp"
android:src="@drawable/icon_button_profile_new"
android:background="#00000000"
android:tag="@string/avatar" />

这个不起作用,Arslan,请在发布之前验证你的解决方案。 - Sadda Hussain

-2

试试这个:

android:background="@android:color/transparent"

或者

imageView.setBackgroundColor(Color.TRANSPARENT);

希望这有帮助。


@hakim:你试过用其他图片吗? - Siddharth_Vyas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接