以编程方式更改可绘制颜色

我正在尝试通过代码更改白色标记图像的颜色。我读到下面的代码应该改变颜色,但我的标记仍然是白色的。

Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )

我错过了什么吗?有没有其他方法可以更改位于我的RES文件夹中的Drawables的颜色?

262185 次浏览

试试这个:

Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, R.drawable.my_drawable);
Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
DrawableCompat.setTint(wrappedDrawable, Color.RED);

使用DrawableCompat非常重要,因为它在API 22设备和更早版本上提供向后兼容性和错误修复。

您可能需要尝试Mode.LIGHTENMode.DARKEN。Android的Javadoc在解释波特达夫模式的作用时表现得很糟糕。您可以在这里查看它们:波特达夫|安卓

我建议在Mozilla的网站上看看合成,在这里。(他们没有Android的所有模式,但他们有很多)。

您可以尝试使用ColorMatrixColorFilter,因为您的主色是白色:

// Assuming "color" is your target color
float r = Color.red(color) / 255f;
float g = Color.green(color) / 255f;
float b = Color.blue(color) / 255f;


ColorMatrix cm = new ColorMatrix(new float[] {
// Change red channel
r, 0, 0, 0, 0,
// Change green channel
0, g, 0, 0, 0,
// Change blue channel
0, 0, b, 0, 0,
// Keep alpha channel
0, 0, 0, 1, 0,
});
ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm);
myDrawable.setColorFilter(cf);

另一种在Lollipop上实现这一点的方法是Android 5。+在位图可绘制上设置色调,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_back"
android:tint="@color/red_tint"/>

如果您要在绘图上使用的颜色数量有限,这将适用于您。查看我的博客文章了解更多信息。

您可能需要在Drawable上调用mutate(),否则所有图标都会受到影响。

Drawable icon = ContextCompat.getDrawable(getContext(), R.drawable.ic_my_icon).mutate();
TypedValue typedValue = new TypedValue();
getContext().getTheme().resolveAttribute(R.attr.colorIcon, typedValue, true);
icon.setColorFilter(typedValue.data, PorterDuff.Mode.SRC_ATOP);

我是这样做的:

public static Drawable changeDrawableColor(int drawableRes, int colorRes, Context context) {
//Convert drawable res to bitmap
final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), drawableRes);
final Bitmap resultBitmap = Bitmap.createBitmap(bitmap, 0, 0,
bitmap.getWidth() - 1, bitmap.getHeight() - 1);
final Paint p = new Paint();
final Canvas canvas = new Canvas(resultBitmap);
canvas.drawBitmap(resultBitmap, 0, 0, p);


//Create new drawable based on bitmap
final Drawable drawable = new BitmapDrawable(context.getResources(), resultBitmap);
drawable.setColorFilter(new
PorterDuffColorFilter(context.getResources().getColor(colorRes), PorterDuff.Mode.MULTIPLY));
return drawable;
}

您可以尝试将其用于SVG Vector Drawable

DrawableCompat.setTint(
DrawableCompat.wrap(myImageView.getDrawable()),
ContextCompat.getColor(context, R.color.another_nice_color)
);

我已经写了一个通用函数,你可以在其中传递上下文,图标是ID可绘制/mipmap图像图标和新的颜色,你需要为该图标。

此函数返回Drawable.

public static Drawable changeDrawableColor(Context context,int icon, int newColor) {
Drawable mDrawable = ContextCompat.getDrawable(context, icon).mutate();
mDrawable.setColorFilter(new PorterDuffColorFilter(newColor, PorterDuff.Mode.SRC_IN));
return mDrawable;
}


changeDrawableColor(getContext(),R.mipmap.ic_action_tune, Color.WHITE);

与公认的答案相同,但有一个更简单的方便方法:

val myDrawable = ContextCompat.getDrawable(context, R.drawable.my_drawable)
myDrawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN)
setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null)

注意,这里的代码是Kotlin.

这对我很有效。确保将“ FF ”放在0x和颜色代码之间。比如这个0xFF2196F3

Drawable mDrawable = ContextCompat.getDrawable(MainActivity.this,R.drawable.ic_vector_home);
mDrawable.setColorFilter(new
PorterDuffColorFilter(0xff2196F3,PorterDuff.Mode.SRC_IN));

您可以尝试对ImageView执行此操作。使用setColorFilter()

imageView.setColorFilter(ContextCompat.getColor(context, R.color.colorWhite));

语法

"your image name".setColorFilter("your context".getResources().getColor("color name"));

例子

myImage.setColorFilter(mContext.getResources().getColor(R.color.deep_blue_new));

使用这个:对于Java

view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_OVER)

为了科特林

view.background.setColorFilter(Color.parseColor("#343434"),PorterDuff.Mode.SRC_OVER)

如果你的背景有圆角等,你可以使用PorterDuff.mode.SRC_top.

像这样创建方法:

//CHANGE ICON COLOR
private void changeIconColor(Context context ,int drawable){
Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, drawable);
assert unwrappedDrawable != null;
Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
DrawableCompat.setTint(wrappedDrawable, getResources().getColor(R.color.colorAccent));
}

并像这样使用它:

    changeIconColor(this,R.drawable.ic_home);

最简单的方法:

imageView.setColorFilter(Color.rgb(r, g b));

imageView.setColorFilter(Color.argb(a, r, g, b));

A、R、G、B:颜色ARGB值。

对于那些使用Kotlin的人一个简单的扩展函数:

fun Drawable.tint(context: Context,  @ColorRes color: Int) {
DrawableCompat.setTint(this, context.resources.getColor(color, context.theme))
}

然后简单地做

background.tint(context, R.color.colorPrimary)

您可以通过以下方式更改可绘制的颜色:

background = view.findViewById(R.id.background)


val uDrawable = AppCompatResources.getDrawable(view.context, R.drawable.background)
uDrawable?.let {
val wDrawable = DrawableCompat.wrap(it)
DrawableCompat.setTint(wDrawable, ContextCompat.getColor(view.context,
color /*specify your int color code*/))
background.background = wDrawable
}

长话短说:

public void changeDrawableColor(Drawable drawable,int color){
drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
}

public Drawable getColoredDrawable(@DrawableRes int resid,int color){
Drawable drawable= ContextCompat.getDrawable(context, resid).mutate();
drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
return drawable;
}

软件开发工具包>;=21一行 MyIconImageView.GetDrawable().SetTint(GetResources().GetColor(MyColor))

科特林版本

val unwrappedDrawable =
AppCompatResources.getDrawable(this, R.drawable.your_drawable)
val wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable!!)
DrawableCompat.setTint(wrappedDrawable, Color.RED)