以编程方式更改可绘制的颜色
我试图通过代码更改白色标记图像上的颜色。 我读过下面的代码应该改变颜色,但我的标记保持白色。
Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )
我错过了什么? 有没有其他的方式来改变位于我res文件夹中的drawables上的颜色?
尝试这个:
Drawable mDrawable = context.getResources().getDrawable(R.drawable.balloons); mDrawable.setColorFilter(new PorterDuffColorFilter(0xffff00,PorterDuff.Mode.MULTIPLY));
编辑: getDrawable(int id)
在当前版本的Android中已弃用。
使用ContextCompat.getDrawable(context, R.drawable.balloons);
对于这个例子。
你可以试试这个svgvector绘制
DrawableCompat.setTint(myImageView.getDrawable(), ContextCompat.getColor(context, R.color.another_nice_color));
您可能需要在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);
另一种方法来做这个在棒棒糖,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"/>
如果您想在绘图板上使用有限数量的颜色,这将对您有用。 看看我的博客文章了解更多信息 。
你可以尝试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);
我已经写了一个通用的函数,你可以通过上下文,图标是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);
你可能想尝试Mode.LIGHTEN
或Mode.DARKEN
。 Android Javadocs在解释PorterDuff模式的工作方面非常糟糕。 你可以在这里看看他们: PorterDuff | Android的
我build议在这里浏览 Mozilla网站上的Compositing 。 (他们没有android的所有模式,但他们有很多)
与接受的答案相同,但是更简单的便利方法:
val myDrawable = ContextCompat.getDrawable(context, R.drawable.my_drawable) myDrawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN) setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null)
请注意,这里的代码是Kotlin。
这就是我所做的:
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; }
这对我有效。 确保在0x和颜色代码之间加上“ff”。 像这个0xff2196F3
Drawable mDrawable = ContextCompat.getDrawable(MainActivity.this,R.drawable.ic_vector_home); mDrawable.setColorFilter(new PorterDuffColorFilter(0xff2196F3,PorterDuff.Mode.SRC_IN));