我想为imageview添加一个颜色过滤器

Sha*_*kar 23 android android-imageview porter-duff

我想一个补充ColorFilterImageView.

目前我正在使用:

ImageView iv = (ImageView)findViewById(resIdOfImageToFilter);
iv.setColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP);
Run Code Online (Sandbox Code Playgroud)

我检查了多种模式PotterDuff,如SRC_IN,SRC等,但我没有得到任何的模式有什么区别...所有模式将整个ImageView完美的红色.

我需要在现有图像中混合使用RED颜色,这样图像看起来就会带有REDDISH色调....

Sha*_*kar 31

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

所以更新的代码将是:

ImageView iv = (ImageView)findViewById(resIdOfImageToFilter);
iv.setColorFilter(Color.RED, PorterDuff.Mode.LIGHTEN);
Run Code Online (Sandbox Code Playgroud)

  • 那是因为图像中没有 Alpha 通道(即透明度)。通常 `setColorFilter()` 用于给图标着色,事实上,默认行为是对所有图像着色,仅保留 alpha 通道。相反,“PorterDuff.Mode.LIGHTEN”会保留亮度,因此图像的彩色部分会变成红色,而白色部分会保持原样。 (2认同)

Md *_*ury 10

您可以在xml文件中使用 android:tint(link).例:

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/your_drawable"
    android:tint="@color/your_color" />
Run Code Online (Sandbox Code Playgroud)

  • 应该是最佳答案。其中your_color是这样的;```&lt;颜色名称=“ your_color”&gt;#55000000 &lt;/ color&gt;``` (2认同)

Tho*_*mas 7

这对我有用:

在res/colors.xml中:

<color name="highlight_color_filter">#A5FF0000</color>
Run Code Online (Sandbox Code Playgroud)

在您的Activity中初始化过滤器并突出显示paint:

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);
Run Code Online (Sandbox Code Playgroud)

然后将过滤器应用于ImageView:

ImageView iv=(ImageView)findViewById(ResIdOfImageToFilter);
iv.setColorFilter(redHighLight);
Run Code Online (Sandbox Code Playgroud)

如果这不起作用尝试应用于ImageView drawable:

iv.getDrawable().setColorFilter(redHighLight);
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 这不会编译.redHighLight是一个Paint而不是ColorFilter. (10认同)

L. *_* G. 5

其他解决方案,您可以保留PorterDuff.Mode.SRC_ATOP模式并使用另一个Alpha来具有透明颜色。

我使用155作为Alpha值:

  final int semiTransparentGrey = Color.argb(155, 185, 185, 185);
  drawable.setColorFilter(semiTransparentGrey, PorterDuff.Mode.SRC_ATOP);
Run Code Online (Sandbox Code Playgroud)