我正在尝试在图像视图上实现一个简单的滤色器,以将黑色图像变成白色图像。为了实现这一点,我执行以下操作:
weatherImg.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
weatherImg.setImageResource(R.drawable.b_clouded_rain);
我也尝试将滤色器中的颜色更改为红色和白色,但它们都没有效果,我做错了什么?
我正在尝试在图像视图上实现一个简单的滤色器,以将黑色图像变成白色图像。为了实现这一点,我执行以下操作:
weatherImg.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
weatherImg.setImageResource(R.drawable.b_clouded_rain);
我也尝试将滤色器中的颜色更改为红色和白色,但它们都没有效果,我做错了什么?
尽管我讨厌回答自己的问题,但我发现了问题:我应该使用:
weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
这取决于您要应用哪种过滤。如果您想在带有透明胶片的图像上应用新颜色,这对我有用:
weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);
如果您想了解有关此 PorterDuff 过滤器的更多信息,我发现了一篇帮助我理解的 goog 文章: http: //www.ibm.com/developerworks/java/library/j-mer0918/阅读一下 :)
在 Android 6 上遇到了同样的问题。通过使用ImageView.getDrawable().setColorFilter()
而不是. 解决了ImageView.setColorFilter()
。
我们使用此代码
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);
}
对我来说,简单地调用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+
setColorFilter
我在运行 4.3 的三星 S3 上遇到问题,我可以让过滤器工作的唯一方法是在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 似乎没有任何效果。
我在使用乘法时遇到了同样的问题
weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.MULTIPLY);
这适用于 png 图标,但不适用于矢量图形。将其更改为默认值适用于两者:
weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
对我来说,只有这个解决方案有效:
image.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
image.setImageResource(R.drawable.img);
如果是矢量图像,则应用过滤器R.drawable.img
,并且对光栅资源没有影响
对于 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);
我可能没有你的确切问题,但我认为当我尝试更改不属于预定义颜色的颜色时它们相似,例如 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();
}
});
我希望它可以帮助你或其他人。