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

时间:2012-07-07 16:02:02

标签: android

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

Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )

我错过了什么吗?有没有其他方法可以改变位于我的res文件夹中的drawable上的颜色?

20 个答案:

答案 0 :(得分:188)

试试这个:

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

答案 1 :(得分:98)

您可以尝试使用svg vector drawable

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

答案 2 :(得分:18)

另一种在Lollipop上执行此操作的方法,android 5. +正在设置一个类似于bitmap的色彩:

<?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"/>

如果您想要在drawables上使用有限数量的颜色,这将适合您。 Check out my blog post for more information

答案 3 :(得分:17)

您可能需要在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);

答案 4 :(得分:8)

您可以尝试使用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);

答案 5 :(得分:7)

您可以针对puts RUBY_VERSION #=>1.9.3 require 'objspace' p ObjectSpace.memsize_of("a"*23) #=> 23 p ObjectSpace.memsize_of("a"*24) #=> 24 p ObjectSpace.memsize_of("a".*1000) #=> 1000 h = {"a"=>1, "b"=>2} p ObjectSpace.memsize_of(h) #=> 116 尝试此操作。使用ImageView

setColorFilter()

答案 6 :(得分:7)

我写了一个通用函数,你可以在其中传递上下文,图标是id drawable / 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);

答案 7 :(得分:5)

这对我有用。确保在0x和颜色代码之间加上“ff”。像这样的0xff2196F3

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

答案 8 :(得分:3)

您可以尝试Mode.LIGHTENMode.DARKEN。 Android Javadocs很难解释PorterDuff模式的功能。您可以在此处查看它们:PorterDuff | Android

我建议在Mozilla的网站here.上查看Compositing(他们没有android所做的所有模式,但他们有很多模式)

答案 9 :(得分:3)

与接受的答案相同,但更方便的方法是:

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

注意,这里的代码是Kotlin。

答案 10 :(得分:1)

只需使用

    android:drawableTint="@color/primary_color"

在您的XML文件中。将primary_color替换为自定义颜色

答案 11 :(得分:1)

对于那些使用Kotlin的人:简单的扩展功能:

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

然后简单地做

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

答案 12 :(得分:1)

您可以通过这种方式更改可绘制颜色:

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
}

答案 13 :(得分:0)

这就是我所做的:

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

答案 14 :(得分:0)

首先:

Syntex-:

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

示例-:

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

答案 15 :(得分:0)

使用此方法:对于Java

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

对于Kotlin

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

如果背景有圆角等,则可以使用PorterDuff.Mode.SRC_ATOP。

答案 16 :(得分:0)

像这样创建方法:

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

答案 17 :(得分:0)

最简单的方法:

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

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

a,r,g,b:颜色argb值。

答案 18 :(得分:0)

长话短说:

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

答案 19 :(得分:0)

SDK >= 21 一行 myIconImageView.getDrawable().setTint(getResources().getColor(myColor))