如何在android中以编程方式设置图像视图的色调?

需要为图像视图设置色调…我使用以下方法:

imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY); 

但它不会改变…

您可以通过以下代码轻松更改色调:

imageView.setColorFilter(Color.argb(255, 255, 255, 255)); //白色

如果你想要色彩的话

 imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.MULTIPLY); 

vector绘制

 imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN); 

@哈迪克是对的。 代码中的其他错误是当您引用您的XML定义的颜色。 您只需将ID传递给setColorFilter方法,此时应使用ID来定位颜色资源,并将资源传递给setColorFilter方法。 在下面重写您的原始代码。

如果此行在您的活动中:

 imageView.setColorFilter(getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY); 

否则,你需要引用你的主要活动:

 Activity main = ... imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY); 

请注意,其他types的资源(如整数,布尔型,维度等)也是如此。除了string,您可以直接在您的活动中使用getString() ,而无需先调用getResources()不问我为什么)。

否则,你的代码看起来不错。 (虽然我没有太多的调查setColorFilter方法…)

这对我有效

 mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500)); 

从棒棒糖开始,还有一个与新的Palette类一起使用的BitmapDrawable的tint方法:

public void setTintList(ColorStateList tint)

public void setTintMode(PorterDuff.Mode tintMode)

在较旧版本的Android上,现在可以使用DrawableCompat库

我尝试了所有的方法后,他们不为我工作。

我通过使用另一个PortDuff.MODE获得解决scheme。

 imgEstadoBillete.setColorFilter(context.getResources().getColor(R.color.green),PorterDuff.Mode.SRC_IN); 

尝试这个。 它应该在支持库支持的所有Android版本上工作:

 public static Drawable getTintedDrawableOfColorResId(@NonNull Context context, @NonNull Bitmap inputBitmap, @ColorRes int colorResId) { return getTintedDrawable(context, new BitmapDrawable(context.getResources(), inputBitmap), ContextCompat.getColor(context, colorResId)); } public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Bitmap inputBitmap, @ColorInt int color) { return getTintedDrawable(context, new BitmapDrawable(context.getResources(), inputBitmap), color); } public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Drawable inputDrawable, @ColorInt int color) { Drawable wrapDrawable = DrawableCompat.wrap(inputDrawable); DrawableCompat.setTint(wrapDrawable, color); DrawableCompat.setTintMode(wrapDrawable, PorterDuff.Mode.SRC_IN); return wrapDrawable; } 

你可以使用上面的任何一个来使它工作。

您可以在这里阅读关于DrawableCompat更有趣的function。

 Random random=new Random; ImageView imageView = (ImageView) view.findViewById(R.id.imageView); ColorFilter cf = new PorterDuffColorFilter(Color.rgb(random.nextInt(255), random.nextInt(255), random.nextInt(255)),Mode.OVERLAY); imageView.setImageResource(R.drawable.ic_bg_box); imageView.setColorFilter(cf); 

从棒棒糖开始,有一种名为ImageView#setImageTintList() ,您可以使用…的好处是,它只需要一个ColorStateList而不是一个颜色,从而使图像的色彩状态感知。

在预棒棒糖设备上,您可以通过设置drawable来获得相同的行为,然后将其设置为ImageView的图像:

 ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_clr_selector); Drawable drawable = DrawableCompat.wrap(imageView.getDrawable()); DrawableCompat.setTintList(drawable, csl); imageView.setImageDrawable(drawable); 

正如@milosmns所说,你应该使用imageView.setColorFilter imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);

此API需要颜色值而不是颜色资源ID,这是您的语句不起作用的根本原因。

大多数答案指的是使用setColorFilter ,这不是最初要求的。

用户@Tad的方向正确,但只适用于API 21+。

要在所有Android版本上设置色调,请使用ImageViewCompat

 ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint)); 

请注意,在这种情况下,您的yourTint必须是“颜色整数”。 如果您有像R.color.blue这样的颜色资源,则需要首先加载颜色int:

 ContextCompat.getColor(context, R.color.blue); 

我发现我们可以使用颜色select器来着色attr:

 mImageView.setEnabled(true); 

XML:

  <ImageView android:id="@+id/image_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_arrowup" android:tint="@color/section_arrowup_color" /> 

section_arrowup_color.xml:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@android:color/white" android:state_enabled="true"/> <item android:color="@android:color/black" android:state_enabled="false"/> <item android:color="@android:color/white"/> </selector> 

由于第一个答案不适合我:

 //get ImageView ImageView myImageView = (ImageView) findViewById(R.id.iv); //colorid is the id of a color defined in values/colors.xml myImageView.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(getApplicationContext(), R.color.colorid))); 

这似乎只适用于API 21 +,但对我来说这不是一个问题。 你可以使用ImageViewCompat来解决这个问题。

我希望我能帮助任何人:-)

不是确切的答案,而是更简单的select:

  • 在图像上放置另一个视图
  • 不pipe你想要(编程)更改视图的alpha值,以获得所需的效果。

这是一个片段:

 <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:layout_width="match_parent" android:layout_height="@dimen/height120" android:contentDescription="@string/my_description" android:scaleType="fitXY" android:src="@drawable/my_awesome_image"/> <View android:layout_width="match_parent" android:layout_height="@dimen/height120" android:alpha="0.5" android:background="@color/my_blue_color"/> </FrameLayout>