我想给ImageView添加一个颜色过滤器。

29

我想在ImageView中添加一个ColorFilter

目前我正在使用:

ImageView iv = (ImageView)findViewById(resIdOfImageToFilter);
iv.setColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP);

我在PotterDuff中尝试了多种模式,如SRC_INSRC等,但在任何模式下都没有看到任何区别...所有的模式都把整个 ImageView 变成了完美的红色。

我需要将红色混合到现有图像中,使图像看起来带有红色色调...


2
糟糕...正确的做法是使用PorterDuff.Mode.Lighten... - Shashank Degloorkar
这是因为您的图像中没有 alpha 通道(即透明度)。通常使用 setColorFilter() 来着色图标,事实上默认行为是对所有图像进行着色,仅保留 alpha 通道。PorterDuff.Mode.LIGHTEN 保留亮度,因此图像的彩色部分变为红色,白色部分则保持不变。 - lorenzo-s
5个回答

42

正确的方法是使用PorterDuff.Mode.LIGHTEN

所以更新后的代码将会是这样的:

ImageView iv = (ImageView)findViewById(resIdOfImageToFilter);
iv.setColorFilter(Color.RED, PorterDuff.Mode.LIGHTEN);

2
这是因为您的图像中没有 alpha 通道(即透明度)。通常使用 setColorFilter() 来着色图标,事实上默认行为是对所有图像进行着色,仅保留 alpha 通道。PorterDuff.Mode.LIGHTEN 保留亮度,因此图像的彩色部分变为红色,白色部分则保持不变。 - lorenzo-s

12

您可以在XML文件中使用 android:tint (链接)。例如:

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/your_drawable"
    android:tint="@color/your_color" />

2
应该是最佳答案。其中,your_color 是这样的东西:<color name="your_color">#55000000</color> - J.C

9

另一种解决方案是,您可以保留PorterDuff.Mode.SRC_ATOP模式并使用另一个alpha值来获得透明颜色。

我使用155作为Alpha值:

  final int semiTransparentGrey = Color.argb(155, 185, 185, 185);
  drawable.setColorFilter(semiTransparentGrey, PorterDuff.Mode.SRC_ATOP);

你如何设置155个阿尔法? - behelit
您可以直接设置 alpha 值,例如在 color.xml 资源文件中或者代码中通过设置第一个 argb 值来定义颜色。示例:int FILTERED_GREY = Color.argb(155, 185, 185, 185); - L. G.

8
这是我的翻译:

以下方法适用于我:

在res/colors.xml文件中:

<color name="highlight_color_filter">#A5FF0000</color>

在您的Activity中初始化过滤器和高亮绘制:

int highlightColor = context.getResources().getColor(R.color.highlight_color_filter);
PorterDuffColorFilter colorFilter = new PorterDuffColorFilter(highlightColor, PorterDuff.Mode.SRC_ATOP);

Paint redHighLight = new Paint();
redHighLight.setColorFilter(targetHitFilter);
redHighLight.setAlpha(190);

然后将过滤器应用于ImageView:

ImageView iv=(ImageView)findViewById(ResIdOfImageToFilter);
iv.setColorFilter(redHighLight);

如果那样不行的话,请尝试应用到 ImageView 的可绘制对象。
iv.getDrawable().setColorFilter(redHighLight);

希望这能帮到你。

不是要表现得很刻薄,但这里有一个更好的答案:https://dev59.com/yWkw5IYBdhLWcg3wJHCF - pgsandstrom
11
无法编译,因为redHighLight是一个Paint而不是一个ColorFilter。 - Zsolt Safrany

1
在你的XML文件中,您可以使用tint。例如:

        <ImageView
            android:id="@+id/scrachImage_1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:tint="@color/colorAccent"
            android:src="@drawable/eagle" />

如果您想以编程方式添加颜色过滤器,则使用以下代码:
scratchImage_2.setColorFilter(Color.BLACK);

您可以使用以下代码移除此颜色过滤器:

scratchImage_2.setColorFilter(null);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接