如何设置色彩为一个图像视图在安卓程序?

需要为图像视图设置色调…我使用它的方式如下:

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

但这并没有改变……

486565 次浏览
< p > # EYZ0:
@ADev在他的答案在这里中有更新的解决方案,但他的解决方案需要更新的支持库- 25.4.0或以上

你可以改变色调,很容易在代码中通过:

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

如果你想要色彩鲜艳的话

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

对于可绘制的向量

imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN);
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);

@Hardik说得对。代码中的另一个错误是在引用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);

注意,其他类型的资源也是如此,比如整数、bool、维度等。除了字符串,你可以直接在你的活动中使用getString(),而不需要首先调用getResources()(不要问我为什么)。

否则,您的代码看起来很好。(虽然我还没有研究太多setColorFilter方法…)

从棒棒糖开始,还有一个色彩方法用于BitmapDrawables,它与新的Palette类一起工作:

(ColorStateList tint)

而且

setTintMode (portterduff . setintmode)模式tintMode)

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

不是确切的答案,而是一个更简单的选择:

  • 在图像上方放置另一个视图
  • 您可以随意更改视图的α值(以编程方式)以获得所需的效果。

以下是其中的一个片段:

<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>
就像@milosmns说的,你应该使用 imageView.setColorFilter (getResouces () .getColor (R.color.blue) android.graphics.PorterDuff.Mode.MULTIPLY); < /代码> < / p >

这个API需要颜色值而不是颜色资源id,这就是为什么你的语句没有工作的根本原因。

这对我很有效

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

试试这个。它应该适用于支持库支持的所有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的有趣特性。

在我尝试了所有的方法后,他们都不适合我。

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

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

从棒棒糖开始,有一个叫做ImageView#setImageTintList()的方法,你可以使用…优点是它采用ColorStateList而不是单一颜色,从而使图像的色调状态感知。

在之前的lollipop设备上,你可以通过着色drawable来获得相同的行为,然后将其设置为ImageView's image drawable:

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

我发现我们可以为tint attr使用颜色选择器:

mImageView.setEnabled(true);

activity_main.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>

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

用户@Tad有他的回答在正确的方向,但它只适用于API 21+。

要设置所有Android版本的色调,使用ImageViewCompat:

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

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

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

因为第一个答案对我不起作用:

//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来解决这个问题。

我希望我能帮到大家:-)

简单一行

imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));

如果你的颜色有十六进制透明度,使用下面的代码。

ImageViewCompat.setImageTintMode(imageView, PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(Color.parseColor("#80000000")));

清除色彩

ImageViewCompat.setImageTintList(imageView, null);

不要用PoterDuff.Mode, 使用setColorFilter()它适用于所有

ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView);
imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read));

我在派对上迟到了,但我没有看到我的解决方案。我们也可以通过setImageResource()设置色调颜色(我的minSdkVersion是24)。

所以,首先,你需要创建一个选择器,并将其保存在/drawable资产文件夹(我称之为ic_color_white_green_search.xml)

<!-- Focused and not pressed -->
<item android:state_focused="true"
android:state_pressed="false">


<bitmap android:src="@drawable/ic_search"
android:tint="@color/branding_green"/>
</item>


<!-- Focused and pressed -->
<item android:state_focused="true"
android:state_pressed="true">


<bitmap android:src="@drawable/ic_search"
android:tint="@color/branding_green"/>
</item>


<!-- Default -->
<item android:drawable="@drawable/ic_search"/>

然后像这样在代码中设置它:

val icon = itemView.findViewById(R.id.icon) as ImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)

如果你想将选择器设置为你的色调:

ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));

加上ADev回答(在我看来是最正确的),因为Kotlin的广泛采用,以及它有用的扩展函数:

fun ImageView.setTint(context: Context, @ColorRes colorId: Int) {
val color = ContextCompat.getColor(context, colorId)
val colorStateList = ColorStateList.valueOf(color)
ImageViewCompat.setImageTintList(this, colorStateList)
}

我认为这是一个在任何Android项目中都有用的功能!

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

我有两个方法为android:

1)

imgView.setColorFilter(context.getResources().getColor(R.color.blue));

2)

 DrawableCompat.setTint(imgView.getDrawable(),
ContextCompat.getColor(context, R.color.blue));

我希望我能帮到大家:-)

多亏了ADev,更好地简化了扩展函数

fun ImageView.setTint(@ColorRes colorRes: Int) {
ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}

用法:-

imageView.setTint(R.color.tintColor)

Kotlin解决方案使用扩展功能,设置和取消设置着色:

fun ImageView.setTint(@ColorInt color: Int?) {
if (color == null) {
ImageViewCompat.setImageTintList(this, null)
return
}
ImageViewCompat.setImageTintMode(this, PorterDuff.Mode.SRC_ATOP)
ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(color))
}
对我来说,这段代码是有效的。我使用它与卡片和图像视图,但我认为它可以在任何视图改变他们的色调颜色。

. cardBookmark是我的cardView
var cardDrawable: Drawable = binding.cardBookmark.background
cardDrawable = DrawableCompat.wrap(cardDrawable)
DrawableCompat.setTint(cardDrawable, resources.getColor(R.color.shuffleColor))
binding.cardBookmark.background = cardDrawable

免责声明:这不是这篇文章的答案。但它是问题的答案,即如何重置可绘制或imageview的颜色/色调。对不起,把这个放在这里,因为这个问题不接受答案,请参阅这篇文章的答案。所以,把它加在这里,这样人们在寻找解决方案时就会得到这个。

正如@RRGT19回答的评论中提到的那样。我们可以使用setImageTintList()重置颜色,并将null作为tintList。它神奇地为我工作。

ImageViewCompat.setImageTintList(imageView, null)

芬兰湾的科特林中的扩展函数,用于设置和取消设置着色。

fun ImageView.setTint(@ColorRes color: Int?) {
if (color == null) {
ImageViewCompat.setImageTintList(this, null)
} else {
ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, color)))
}}

使用:yourImageView.setTint(R.color.white)设置和删除:yourImageView.setTint(null)