问题
I'm trying to implement a simple colorfilter on an imageview to turn the black image into a white image. In order to achieve that I do the following:
weatherImg.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
weatherImg.setImageResource(R.drawable.b_clouded_rain);
I've also tried to change to color in the color filter to red and white but all of them have no effect, what am I doing wrong?
回答1:
As much as I hate to answer my own questions I found the problem: I should've used:
weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
回答2:
It depends on what kind of filtering you want to apply. If yout want to apply a new color on an image with transparencies on it, that's what worked for me:
weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);
If you want to learn more about this PorterDuff filters, I found a goog article that helped me understand: http://www.ibm.com/developerworks/java/library/j-mer0918/ give it a read :)
回答3:
Had the same issue on Android 6. Solved by using ImageView.getDrawable().setColorFilter()
instead of ImageView.setColorFilter()
.
回答4:
We use this code
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);
}
回答5:
I was having issues with setColorFilter
on a Samsung S3 running 4.3 and the only way I could get the filter to work was by applying it in the draw(Canvas canvas)
method:
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);
}
Simple applying setColorFilter
to the BitmapDrawable didn't seem to have any effect.
回答6:
For me only this solution worked:
image.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
image.setImageResource(R.drawable.img);
filter applies if R.drawable.img
is vector image, and has no effect for raster resource
回答7:
For me, simply calling setColorFilter()
on the ImageView
wasn't working.
imageView.setColorFilter(ResourcesCompat.getColor(resources, color, null)) //didnt work on 21, only 22+
For whatever reason, on API 21, the only way I could get setColorFilter()
to work properly was to post the change to the views message queue.
imageView.post { imageView.setColorFilter(ResourcesCompat.getColor(resources, color, null)) } //this works on 21+
回答8:
For Android 4.3 and 4.4, setColorFilter does not work. Use DrawableCompat instead.
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);
回答9:
I run into the same issue when using multiply
weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.MULTIPLY);
This worked for png icons but not for vector graphics. Changing it to the default works for both:
weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
来源:https://stackoverflow.com/questions/18954042/setcolorfilter-not-working