如何在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>