Android的Xamarin:ImageView.SetColorFilter()对我的ImageView没有影响?

Android的Xamarin:ImageView.SetColorFilter()对我的ImageView没有影响?,android,xamarin,android-imageview,Android,Xamarin,Android Imageview,我有一个使用alpha通道的imageView,它是圆形的,基本上只由黑色轮廓组成。但是,在一个简单的例子中,我需要将imageview显示为白色,而不是黑色。其他一切都需要保持不变。在谷歌搜索了一下之后,我想到了以下几点: ImageButton btnHeader = new ImageButton(this); btnHeader.SetBackgroundResource(Resource.Drawable.mainmenu_btn_news_bol); btnHeader.SetCol

我有一个使用alpha通道的
imageView
,它是圆形的,基本上只由黑色轮廓组成。但是,在一个简单的例子中,我需要将
imageview
显示为白色,而不是黑色。其他一切都需要保持不变。在谷歌搜索了一下之后,我想到了以下几点:

ImageButton btnHeader = new ImageButton(this);
btnHeader.SetBackgroundResource(Resource.Drawable.mainmenu_btn_news_bol);
btnHeader.SetColorFilter(new Color(Color.White), PorterDuff.Mode.SrcIn);

这至少会对
ImageView
产生一些影响,但事实并非如此。是的,好像第三行代码被跳过了。有人能解释一下这是一个bug还是我吗?

直接在
ImageButton
上设置颜色过滤器只会影响它的源图像,而不会影响背景。也就是说,它将影响使用
SetImage*()
方法设置的图像。如果这就是您想要做的,那么只需将
SetBackgroundResource()
调用更改为
SetImageResource()

相反,如果您试图专门过滤背景,则需要直接在背景
Drawable
上设置过滤器。例如:

btnHeader.Background.SetColorFilter(new Color(Color.White), PorterDuff.Mode.SrcIn);
此外,默认情况下,从同一资源创建的单独的
Drawable
s将共享一个公共状态,因此,如果有多个
视图使用同一资源映像,则在其中一个图像上设置过滤器也将影响所有其他图像。在应用过滤器之前,可以通过首先对特定的
Drawable
调用
Mutate()
来强制为其创建一个新的、单独的状态。例如,对于背景图像:

btnHeader.Background.Mutate().SetColorFilter(new Color(Color.White), PorterDuff.Mode.SrcIn);

这样设置颜色过滤器只会影响源图像,而不会影响背景。也就是说,如果您改为
btnHeader.SetImageResource(…)
,它会过滤掉它。如果你特别想过滤背景,你必须直接在背景上设置过滤器:
btnHeader.background.SetColorFilter(…)
。嘿,谢谢你,伙计!把这个作为答案,这样我就可以接受了。很好用!:)还有一件事:我在同一个活动中使用同一个ImageButton两次。现在两个都是白色的,而不仅仅是应用过滤器的那个。你能再帮我一次吗?:)是的,您可以先对drawable进行变异,这样它就不会与从同一资源创建的其他文件共享一个公共状态。在那里插入一个
Mutate()
调用:
btnHeader.Background.Mutate().SetColorFilter(…)
。(我想这是对的。我在猜测Xamarin的语法。)太棒了。非常感谢您的知识!:)