我试图通过代码更改白色标记图像的颜色。我已经阅读了下面的代码应该会更改颜色,但是我的标记仍然是白色。
Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )
我错过了什么吗?有没有其他方法可以更改位于我的“res”文件夹中的可绘制对象的颜色?
我试图通过代码更改白色标记图像的颜色。我已经阅读了下面的代码应该会更改颜色,但是我的标记仍然是白色。
Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )
我错过了什么吗?有没有其他方法可以更改位于我的“res”文件夹中的可绘制对象的颜色?
试试这个:
Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, R.drawable.my_drawable);
Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
DrawableCompat.setTint(wrappedDrawable, Color.RED);
使用 DrawableCompat
很重要,因为它在 API 22 及之前的设备上提供了向后兼容性和错误修复。
您可以尝试使用此方法将SVG矢量绘图转换为可绘制的格式
DrawableCompat.setTint(
DrawableCompat.wrap(myImageView.getDrawable()),
ContextCompat.getColor(context, R.color.another_nice_color)
);
null
传递给Drawable#setTintList(ColorStateList)
*。 - arekolek你可能需要在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);
mutate()
,这正是我在寻找的。谢谢。 - Adham Gamal您可以尝试使用setColorFilter()
来为ImageView
进行调整。
imageView.setColorFilter(ContextCompat.getColor(context, R.color.colorWhite));
在Android 5.+的Lollipop上,另一种方法是为位图可绘制对象设置色彩,如下所示:
<?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"/>
如果您希望在可绘图对象上使用有限数量的颜色,则此方法适用于您。 请查看我的博客文章以获取更多信息。
minSdkVersion 16
和Android 4.1.1设备测试了一下。) - Jonikandroid:background="..."
时那样拉伸以适应布局。非常奇怪! - Princepublic 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);
这对我有用。确保在颜色代码的0x和"ff"之间加上。像这样0xff2196F3
Drawable mDrawable = ContextCompat.getDrawable(MainActivity.this,R.drawable.ic_vector_home);
mDrawable.setColorFilter(new
PorterDuffColorFilter(0xff2196F3,PorterDuff.Mode.SRC_IN));
你可以尝试使用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);
对于使用 Kotlin 的开发者,提供一个简单的扩展函数:
fun Drawable.tint(context: Context, @ColorRes color: Int) {
DrawableCompat.setTint(this, context.resources.getColor(color, context.theme))
}
background.tint(context, R.color.colorPrimary)
val myDrawable = ContextCompat.getDrawable(context, R.drawable.my_drawable)
myDrawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN)
setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null)
注意,此处的代码是使用 Kotlin 编写的。