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


396

需要为图像视图设置色调...我以以下方式使用它:

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

但这并没有改变...


15
您可能使用了整数资源ID而不是整数颜色值,请尝试将R.color.blue转换为getResources()。getColor(R.color.blue)
milosmns 2015年

Drawable drawable = ...; drawable.setColorFilter(ContextCompat.getColor(context,R.color.white),PorterDuff.Mode.DST); imageView.setImageDrawable(drawable); //任何颜色都可以在这里使用
flame3

Answers:


915

您可以通过以下代码很容易地在代码中更改颜色:

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);

UPDATE
@ADev在他的回答较新的解决方案在这里,但他的解决方案需要新的支持库- 25.4.0或更高版本。



12
在xml中,android:tint =“ @ color / blue”
路易斯

1
加上android:tint是21+
androidguy

8
android:tint适用于所有android版本。也许您在说什么drawableTint
finstas '17

11
PorterDuff.Mode.MULTIPLY在我的情况下不起作用,我使用了PorterDuff.Mode.SRC_IN,并且可以正常工作
Mohamed Nageh

234

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

用户@Tad 的回答正确,但是仅适用于API 21+。

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

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

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

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

6
应该是公认的答案。请注意,它仅适用于ImageView具有AppCompat主题的xml 实例或AppCompatImageView子类。
路易CAD

1
@ADev感谢您的解决方案,但在2013年提出了该问题,ImageViewCompat和AppCompatImageView v4版本分别在2017年6月和2016年12月25.1.0支持lib 25.4.0 :)
Hardik

1
@ADev当然是,但是您没有在答案中正确提及它,因为您的解决方案是新的,需要更新的支持库25.4.0及更高版本,因为在较低版本的支持库中,此类无法使用,所以没人能找到它! !! 顺便说一句,我编辑了答案:)美好的一天...
Hardik '18

这是不工作的API 16
Tayyab了Mazhar

49

这对我有用

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

是啊,工作对我来说,没有第二个参数..它也可以去mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
Biskrem穆罕默德

赞成,并且没有第二个参数,它的工作原理就像魅力。Thx @ toobsco42
拉维·瓦尼亚

35

@Hardik说的对。代码中的另一个错误是当您引用XML定义的颜色时。setColorFilter当您应使用ID定位颜色资源并将资源传递给方法时,仅将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);

请注意,其他类型的资源也是如此,例如整数,布尔值,尺寸等。除了字符串,您可以直接使用字符串 getString()在“活动”中而无需先调用getResources()(不要问我为什么) 。

否则,您的代码看起来不错。(尽管我没有对此setColorFilter方法进行过多研究...)


22

在我尝试了所有方法之后,它们对我不起作用。

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

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


12

尝试这个。它应该在支持库支持的所有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;
}

您可以使用上述任何一种来使其工作。

您可以在docs上阅读有关DrawableCompat更有趣的功能的信息


1
我还必须做imageView.getBackground()才能获取drawable,因为imageView.getDrawable()它返回的是null。
Rock Lee

@RockLee确保在图像视图xml中使用src或在代码中使用setImageResource
orelzion

这是为imageview背景设置色彩的完美方法
leegor

12

借助ADev,更好地简化了扩展功能

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

用法:-

imageView.setTint(R.color.tintColor)

Button / TextView的文本色调是否也有类似的样式?
Android开发人员

您是说textview可绘制的textview文本颜色还是色调?
Manohar Reddy

我的意思是“文字色调”。文字的颜色。但是我认为这很成问题,因为文本的每个状态都有一种颜色...那么,当我设置重音颜色时,它又如何正常工作...奇怪....也许可以将重音颜色设置为一个特定的Button(或TextView),以编程方式进行?
Android开发人员

11

如果您的颜色具有十六进制透明度,请使用以下代码。

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

清除色彩

ImageViewCompat.setImageTintList(imageView, null);

什么是“ img”的类型
Beyaz

1
@Beyaz img的类型为ImageView。


9

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

//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解决该问题。

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


7

从棒棒糖开始,有一种叫做的方法ImageView#setImageTintList(),您可以使用...的优点是,它只需要一种ColorStateList颜色,而不是一种颜色,因此可以使图像知道色调。

在棒棒糖之前的设备上,您可以通过对可绘制对象进行着色然后将其设置为ImageView图像可绘制对象来获得相同的行为:

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

6
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);

6

在Android中以编程方式为图像视图设置色彩

我有两种android方法:

1)

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

2)

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

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


4

自从Kotlin被广泛采用以来,它就添加了ADev答案(我认为这是最正确的)及其有用的扩展功能:

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

我认为这是一个功能,可以在任何Android项目中使用!


4

我发现我们可以将颜色选择器用于色调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>

嗨,它不适用于矢量可绘制对象。
Manukumar

@Manukumar使用app:srcCompat代替android:src,并将其添加vectorDrawables.useSupportLibrary = truedefaultConfigbuild.gradle文件的一部分中。经过测试,可以在Kitkat模拟器上正常工作。
Android开发人员

3

不要使用PoterDuff.Mode,使用setColorFilter()它对所有人都有效。

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

2

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

该API需要颜色值而不是颜色资源ID,这就是您的语句无法正常工作的根本原因。


2

我参加聚会很晚,但是我没有看到上面的解决方案。我们可以通过设置色彩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)


0

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))
}

-4

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

  • 在图像上方放置另一个视图
  • 根据需要(以编程方式)更改视图的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>

这是关于色调!不是透明的Alpha。
大卫

但这最终成为一种色彩。您应该自己尝试。这只是看事物的一种方式。
Shubham Chaudhary

@ShubhamChaudhary我知道这很晚了,但是如果图片是怎么办png。那背景不会改变吗?Alpha和色调也有很大不同。色调就像换色,如果我没看错的话。无意冒犯。只是想帮助:)
KISHORE_ZE 2016年

有效点。这个答案对我来说很有帮助。希望也适合别人的鞋子。
Shubham Chaudhary
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.