尝试了一些方法:首先我尝试将图像作为资源 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){
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,到目前为止它运作得非常好。