213

我正在编辑以使问题更简单,希望这有助于获得准确的答案。

假设我有以下oval形状:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <solid android:angle="270"
           android:color="#FFFF0000"/>
    <stroke android:width="3dp"
            android:color="#FFAA0055"/>
</shape>

如何在活动类中以编程方式设置颜色?

4

15 回答 15

295

注意:答案已更新以background涵盖ColorDrawable. 感谢Tyler Pfaff指出这一点。

drawable 是一个椭圆形,是 ImageView 的背景

DrawableimageView使用中获取getBackground()

Drawable background = imageView.getBackground();

检查通常的嫌疑人:

if (background instanceof ShapeDrawable) {
    // cast to 'ShapeDrawable'
    ShapeDrawable shapeDrawable = (ShapeDrawable) background;
    shapeDrawable.getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof GradientDrawable) {
    // cast to 'GradientDrawable'
    GradientDrawable gradientDrawable = (GradientDrawable) background;
    gradientDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof ColorDrawable) {
    // alpha value may need to be set again after this call
    ColorDrawable colorDrawable = (ColorDrawable) background;
    colorDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
}

紧凑型:

Drawable background = imageView.getBackground();
if (background instanceof ShapeDrawable) {
    ((ShapeDrawable)background).getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof GradientDrawable) {
    ((GradientDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof ColorDrawable) {
    ((ColorDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
}

请注意,不需要进行空值检查。

但是,mutate()如果在其他地方使用它们,您应该在修改它们之前使用它们。(默认情况下,从 XML 加载的可绘制对象共享相同的状态。)

于 2013-07-24T04:28:13.503 回答
66

现在更简单的解决方案是将您的形状用作背景,然后通过以下方式以编程方式更改其颜色:

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

有关可用选项,请参阅PorterDuff.Mode

更新(API 29):

上述方法自 API 29 起已弃用,并替换为以下方法:

view.background.colorFilter = BlendModeColorFilter(Color.parseColor("#343434"), BlendMode.SRC_ATOP)

有关可用选项,请参阅BlendMode

于 2018-07-02T11:57:36.520 回答
50

这样做:

    ImageView imgIcon = findViewById(R.id.imgIcon);
    GradientDrawable backgroundGradient = (GradientDrawable)imgIcon.getBackground();
    backgroundGradient.setColor(getResources().getColor(R.color.yellow));
于 2014-01-11T08:55:30.810 回答
21

不久前回答了这个问题,但它可以通过重写为 kotlin 扩展函数来实现现代化。

fun Drawable.overrideColor(@ColorInt colorInt: Int) {
    when (this) {
        is GradientDrawable -> setColor(colorInt)
        is ShapeDrawable -> paint.color = colorInt
        is ColorDrawable -> color = colorInt
    }
}
于 2017-10-09T22:30:51.807 回答
16

尝试这个:

 public void setGradientColors(int bottomColor, int topColor) {
 GradientDrawable gradient = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]  
 {bottomColor, topColor});
 gradient.setShape(GradientDrawable.RECTANGLE);
 gradient.setCornerRadius(10.f);
 this.setBackgroundDrawable(gradient);
 }

有关更多详细信息,请查看此链接

希望有所帮助。

于 2013-07-24T01:05:00.623 回答
15

希望这会帮助有同样问题的人

GradientDrawable gd = (GradientDrawable) YourImageView.getBackground();
//To shange the solid color
gd.setColor(yourColor)

//To change the stroke color
int width_px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, youStrokeWidth, getResources().getDisplayMetrics());
gd.setStroke(width_px, yourColor);
于 2014-09-05T15:17:37.673 回答
12

扩展Vikram 的答案,如果您正在为动态视图着色,例如回收器视图项目等......那么您可能想在设置颜色之前调用 mutate() 。如果您不这样做,任何具有公共可绘制对象(即背景)的视图也将更改/着色其可绘制对象。

public static void setBackgroundColorAndRetainShape(final int color, final Drawable background) {

    if (background instanceof ShapeDrawable) {
        ((ShapeDrawable) background.mutate()).getPaint().setColor(color);
    } else if (background instanceof GradientDrawable) {
        ((GradientDrawable) background.mutate()).setColor(color);
    } else if (background instanceof ColorDrawable) {
        ((ColorDrawable) background.mutate()).setColor(color);
    }else{
        Log.w(TAG,"Not a valid background type");
    }

}
于 2016-03-10T00:42:40.013 回答
7

this is the solution that works for me...wrote it in another question as well: How to change shape color dynamically?

//get the image button by id
ImageButton myImg = (ImageButton) findViewById(R.id.some_id);

//get drawable from image button
GradientDrawable drawable = (GradientDrawable) myImg.getDrawable();

//set color as integer
//can use Color.parseColor(color) if color is a string
drawable.setColor(color)
于 2015-01-26T16:10:02.233 回答
7

没有什么对我有用,但是当我设置色调颜色时,它适用于 Shape Drawable

 Drawable background = imageView.getBackground();
 background.setTint(getRandomColor())

需要安卓 5.0 API 21

于 2019-03-01T12:13:21.523 回答
3

我的Kotlin扩展功能版本基于上面的Compat答案:

fun Drawable.overrideColor_Ext(context: Context, colorInt: Int) {
    val muted = this.mutate()
    when (muted) {
        is GradientDrawable -> muted.setColor(ContextCompat.getColor(context, colorInt))
        is ShapeDrawable -> muted.paint.setColor(ContextCompat.getColor(context, colorInt))
        is ColorDrawable -> muted.setColor(ContextCompat.getColor(context, colorInt))
        else -> Log.d("Tag", "Not a valid background type")
    }
}
于 2019-09-05T06:58:05.130 回答
2

用半径填充形状的简单方法是:

(view.getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);
于 2019-02-05T13:11:35.857 回答
1

可能是我为时已晚。但是如果您使用的是 Kotlin。有这样的方法

var gd = layoutMain.background as GradientDrawable

 //gd.setCornerRadius(10)
  gd.setColor(ContextCompat.getColor(ctx , R.color.lightblue))
  gd.setStroke(1, ContextCompat.getColor(ctx , R.color.colorPrimary)) // (Strokewidth,colorId)

享受....

于 2020-02-04T11:31:35.323 回答
0

对于使用 C# Xamarin 的任何人,这里有一个基于 Vikram 片段的方法:

private void SetDrawableColor(Drawable drawable, Android.Graphics.Color color)
{
    switch (drawable)
    {
        case ShapeDrawable sd:
            sd.Paint.Color = color;
            break;
        case GradientDrawable gd:
            gd.SetColor(color);
            break;
        case ColorDrawable cd:
            cd.Color = color;
            break;
    }
}
于 2019-11-08T04:12:33.370 回答
0

更改自定义可绘制对象的纯色的最佳方法是 For Kotlin。

 (findViewById<TextView>(R.id.testing1).getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN); 
于 2021-07-09T14:38:52.700 回答
0

这可能会有所帮助

1.将形状颜色初始设置为透明

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
   <solid android:angle="270"
       android:color="@android:color/transparent"/>
   <stroke android:width="3dp"
        android:color="#FFAA0055"/>
</shape>
  1. 将形状设置为视图的背景

  2. 如下设置您的首选颜色:

    Drawable bg = view.getBackground();
    bg.setColorFilter(Color.parseColor("#Color"), PorterDuff.Mode.ADD);
    
于 2021-08-19T20:08:00.903 回答