Drawable ColorFilter通过活动转换保留相同的资源

时间:2016-04-12 15:24:14

标签: android colorfilter

我有一些带有一些菜单项的活动,我为此更改了图标颜色:

private void colorMenuItem(MenuItem item) {
  if (item != null) {
    Drawable icon = item.getIcon();
    if (icon != null) {
      icon.setColorFilter(getResources().getColor(R.color.some_color), PorterDuff.Mode.SRC_ATOP);
    }
  }
}

图标是材质图标集中的白色可绘制PNG文件。这按预期工作,菜单项根据需要着色。

但是,当我启动另一个使用已经着色的相同可绘制资源的活动时,但在另一个视图中(例如FAB而不是菜单),此视图的ColorFilter仍然存在。那是为什么?

FAB是否应该再次加载资源文件而不应该是白色(或不变)?

2 个答案:

答案 0 :(得分:2)

However, when I start another activity which makes use of the same drawable resource which was already colored, but in another view (e.g a FAB instead of the menu), the ColorFilter for this view remains. Why is that?

这是因为drawable或bitmap已经缓存,因此下一次调用相同的drawable id将是之前已经着色的drawable。

要修复它,首先要改变drawable,然后再使用它来生成另一个实例,以防止它被缓存。

Drawable icon = item.getIcon().mutate(); //mutate it to prevent caching

答案 1 :(得分:0)

之前我遇到过同样的问题,因为我记得每个引用的图像资源都应用了过滤器。你可以使用

icon.setColorFilter(null)

在下次使用时重置资源上的滤镜。通过这种方式,在删除此图像之前应用了任何过滤器。