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

Android 以编程方式更改可绘制颜色,android,Android,我试图通过代码改变白色标记图像的颜色。我已经读到下面的代码应该改变颜色,但我的标记仍然是白色的 Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY ) 我错过什么了吗?是否有其他方法可以更改位于“我的res”文件夹中的绘图设备的颜色?尝试以下方法: Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, R.drawable.my_drawable); Draw

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

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设备和更早版本上提供了向后兼容性和错误修复。

您可能需要尝试
模式。变亮
模式。变暗
。Android Javadocs在解释PorterDuff模式的功能时非常糟糕。您可以在此处查看它们:


我建议你在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);

另一种在棒棒糖上实现的方法是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"/>


如果您想要在您的抽绳上使用的颜色数量有限,这将适用于您

您可能需要在绘图板上调用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矢量可绘制模式下尝试此操作

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

我已经编写了一个通用函数,您可以在其中传递上下文,图标是id drawable/mipmap图像图标和该图标所需的新颜色

此函数返回一个可绘制的

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


只需使用

    android:drawableTint="@color/primary_color"

在XML文件中。将主颜色替换为自定义颜色

语法

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

myImage.setColorFilter(mContext.getResources().getColor(R.color.deep_blue_new));
使用这个:For java

view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_OVER)
为科特林

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

如果您的背景有圆角等,您可以在顶部使用PorterDuff.Mode.SRC_。创建如下方法:

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


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



嗯,颜色仍然是白色。这可能与可能导致问题的hello mapview
OverlayItems
类有关吗?这是我的res文件夹中的常规绘图,没什么特别的…@ρ∑ρρєK你真是太棒了。非常有用如果你想让它使用更广泛的源颜色,你可能更喜欢PorterDuff.Mode.SRC_。porterduffcloorfilter构造函数采用ARGB颜色格式使用#mutate()为避免与任何其他可绘制文件共享其状态,否则如果重用该可绘制文件,可能会出现错误的颜色。已接受的答案对我无效。使用此[1],[1]:我认为此处的所有答案都会更改背景色,但不会更改图像的颜色。我说的对吗?有人能告诉我吗?我在这里尝试了所有的解决方案,也在stackoverflow上尝试了相同的问题,但在五月的案例中,它们只改变了背景颜色。所以我认为,我们只能改变背景颜色,而不能改变图像的颜色。我说的对吗?检查这个答案:很好!顺便说一句,这似乎也适用于棒棒糖前。(刚刚用
minSdkVersion 16
和安卓4.1.1设备进行了测试。)以这种方式创建位图时,它不会像使用
Android:background=“…”
时那样拉伸以适应布局。真奇怪!我想这是因为你没有在这里创建一个9补丁。很抱歉,这个页面不存在=(@Jonik您提供的问题中的答案是不相关的。这个问题是询问如何更改Drawable的颜色,而不是ImageView。我见过的svg的最佳方式。与公认的答案相比,我更喜欢这个,虽然两者都可以,但对于这个问题,我不必担心Drawable要设置什么,我只需要找到已经存在的一个,而且它也是backward兼容,太好了!当什么都不起作用时,最好的答案是iot像魅力一样工作!非常感谢!注意:它也适用于当您的imageView/AppCompatImageView中有xml可绘制时如何以编程方式删除它?@HardikJoshi文档说:要清除色调,请将
null
传递到
drawable#setTintList(ColorStateList)
Hi@Bek欢迎使用stackoverflow。如果这对您有效,那么包含一个JSFIDLE和最小的解决方案将非常有帮助。它将帮助发布问题的人正确理解。这只在OP使用ImageView而不是drawables时才有效。这只适用于android M和更高版本真正的M让人难以置信的是,
mutate()
这正是我一直在寻找的。谢谢。这个标题专门询问如何通过编程实现。
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;
}