Android中如何将网络下载图片变暗并设为LinearLayout背景?
解决Picasso加载图片调暗后显示纯黑的问题
嘿,我来帮你搞定这个问题!你现在遇到的情况是因为用了PorterDuff.Mode.SRC_IN这个混合模式——它的作用是只保留源图像和目标颜色重叠的区域,当你用纯黑色作为滤镜时,就会完全覆盖原图,导致图片看不见。下面给你几种可行的解决方案:
方案一:更换PorterDuff混合模式
选择能让黑色与原图混合实现调暗效果的模式,比如DARKEN、MULTIPLY或OVERLAY,同时建议使用半透明黑色来获得更自然的调暗效果,而不是纯黑:
Picasso.get().load(url).into(new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { // 使用半透明黑色(alpha值128,范围0-255,数值越小越透明) int darkOverlayColor = Color.argb(128, 0, 0, 0); BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), bitmap); // 改用DARKEN模式混合 bitmapDrawable.setColorFilter(new PorterDuffColorFilter(darkOverlayColor, PorterDuff.Mode.DARKEN)); linearLayout.setBackground(bitmapDrawable); } @Override public void onBitmapFailed(Exception e, Drawable errorDrawable) { // 可以在这里添加失败后的处理逻辑,比如设置默认背景 } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { // 可选:设置加载中的占位图,提升用户体验 } });
方案二:使用ColorMatrix精确调整亮度
如果你需要更精准的暗度控制,可以用ColorMatrix来调整图片的亮度值(0~1之间为调暗,1为正常亮度,大于1则变亮):
Picasso.get().load(url).into(new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { // 亮度值设置为0.6(可根据需求自由调整,0为全黑,1为原图亮度) float brightness = 0.6f; ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.set(new float[]{ brightness, 0, 0, 0, 0, 0, brightness, 0, 0, 0, 0, 0, brightness, 0, 0, 0, 0, 0, 1, 0 }); BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), bitmap); bitmapDrawable.setColorFilter(new ColorMatrixColorFilter(colorMatrix)); linearLayout.setBackground(bitmapDrawable); } @Override public void onBitmapFailed(Exception e, Drawable errorDrawable) {} @Override public void onPrepareLoad(Drawable placeHolderDrawable) {} });
方案三:自定义Picasso Transformation(推荐)
这种方式更符合Picasso的设计理念,而且调暗逻辑可以复用,适合多处需要调暗图片的场景:
// 自定义调暗Transformation class DarkenTransformation implements Transformation { private final float brightness; public DarkenTransformation(float brightness) { this.brightness = brightness; } @Override public Bitmap transform(Bitmap source) { Bitmap result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), source.getConfig()); Canvas canvas = new Canvas(result); Paint paint = new Paint(); ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.set(new float[]{ brightness, 0, 0, 0, 0, 0, brightness, 0, 0, 0, 0, 0, brightness, 0, 0, 0, 0, 0, 1, 0 }); paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix)); canvas.drawBitmap(source, 0, 0, paint); source.recycle(); // 回收原Bitmap节省内存 return result; } @Override public String key() { return "darken:" + brightness; } } // 使用方式 Picasso.get() .load(url) .transform(new DarkenTransformation(0.6f)) // 传入自定义亮度值 .into(new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { linearLayout.setBackground(new BitmapDrawable(getResources(), bitmap)); } @Override public void onBitmapFailed(Exception e, Drawable errorDrawable) {} @Override public void onPrepareLoad(Drawable placeHolderDrawable) {} });
额外注意事项
- 记得把
Target对象保存为Activity/Fragment的成员变量,否则可能会被GC回收,导致图片加载完成后没有回调。 - 如果你的
LinearLayout有padding或者其他背景设置,确保没有覆盖掉新设置的调暗背景图。
内容的提问来源于stack exchange,提问作者khateeb
相关产品推荐
相关产品推荐

