我正在尝试在imageview上实现一个简单的colorfilter,将黑色图像变成白色图像。为了达到这个目的,我做了以下几点:
weatherImg.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
weatherImg.setImageResource(R.drawable.b_clouded_rain);
我也尝试将滤镜中的颜色更改为红色和白色,但所有这些都没有效果,我做错了什么?
答案 0 :(得分:78)
尽管我讨厌回答自己的问题,但我发现了问题: 我应该使用:
weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
答案 1 :(得分:26)
这取决于您要应用的过滤类型。如果你想在带有透明胶片的图像上应用新颜色,这对我有用:
weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);
如果你想了解更多关于这个PorterDuff过滤器的信息,我发现了一篇帮助我理解的goog文章:http://www.ibm.com/developerworks/java/library/j-mer0918/给它一个读数:)
答案 2 :(得分:18)
在Android 6上遇到同样的问题。使用ImageView.getDrawable().setColorFilter()
代替ImageView.setColorFilter()
解决了问题。
答案 3 :(得分:4)
我们使用此代码
Drawable drawable = DrawableCompat.wrap(getDrawable(drawableResource));
drawable.mutate();
DrawableCompat.setTint(drawable, getColor(color));
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
public static int getColor(int id) {
return ContextCompat.getColor(getInstance().context, id);
}
public static Drawable getDrawable(int id) {
return ContextCompat.getDrawable(getInstance().context, id);
}
答案 4 :(得分:3)
我在运行4.3的Samsung S3上遇到了setColorFilter
的问题,而我可以让过滤器工作的唯一方法就是在draw(Canvas canvas)
方法中应用它:
public class ColouredDrawable extends BitmapDrawable {
private ColorFilter mColorFilter;
public ColouredDrawable(Bitmap toTransform, int toColour, Resources resources) {
super(resources, toTransform);
float[] matrix = {
0, 0, 0, 0, ((toColour & 0xFF0000) / 0xFFFF),
0, 0, 0, 0, ((toColour & 0xFF00) / 0xFF),
0, 0, 0, 0, (toColour & 0xFF),
0, 0, 0, 1, 0 };
mColorFilter = new ColorMatrixColorFilter(matrix);
}
@Override
public void draw(Canvas canvas) {
setColorFilter(mColorFilter);
super.draw(canvas);
}
简单地将setColorFilter
应用于BitmapDrawable似乎没有任何效果。
答案 5 :(得分:2)
对我来说,只有这个解决方案有效:
image.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
image.setImageResource(R.drawable.img);
如果R.drawable.img
是矢量图像,过滤器适用,并且对栅格资源无效
答案 6 :(得分:2)
对我来说,仅在setColorFilter()
上调用ImageView
是行不通的。
imageView.setColorFilter(ResourcesCompat.getColor(resources, color, null)) //didnt work on 21, only 22+
无论出于何种原因,在API 21上,我都能使setColorFilter()
正常工作的唯一方法是将更改发布到视图消息队列中。
imageView.post { imageView.setColorFilter(ResourcesCompat.getColor(resources, color, null)) } //this works on 21+
答案 7 :(得分:0)
对于Android 4.3和4.4,setColorFilter不起作用。请改用DrawableCompat。
val drawable = DrawableCompat.wrap(ContextCompat.getDrawable(
context,
R.drawable.b_clouded_rain));
DrawableCompat.setTint(drawable, foregroundColor);
DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN)
.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
weatherImg.setImageResource(R.drawable.b_clouded_rain);
答案 8 :(得分:0)
使用乘法时遇到相同的问题
weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.MULTIPLY);
这适用于png图标,但不适用于矢量图形。 将其更改为默认值可同时适用于两种情况:
weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
答案 9 :(得分:0)
在您尝试更改不属于预定义颜色的颜色(例如YELLOW> BLUE> GRAY和其他一些颜色)时,我可能没有像您一样的确切问题,但我在ColorFiler中遇到了类似问题无论我尝试使用哪种颜色,结果都是一样。
所以当我使用....
imageView3.setColorFilter(0x85ffdd , PorterDuff.Mode.MULTIPLY);
我得到了相同的黑色 然后我发现了
int color = Color.parseColor("#85ffdd");
现在我可以毫无问题地使用任何颜色。
imageView3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int color = Color.parseColor("#85ffdd");
imageView3.setColorFilter(color, PorterDuff.Mode.MULTIPLY);
//get other images to default
imageView1.clearColorFilter();
imageView2.clearColorFilter();
}
});
我希望它可以帮助您或其他人。