我正在编辑以使问题更简单,希望这有助于获得准确的答案。
说我有以下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>
如何在活动类中以编程方式设置颜色?
答案 0 :(得分:219)
注意 :答案已更新,以涵盖background
是ColorDrawable
实例的情况。感谢Tyler Pfaff,指出了这一点。
drawable是一个椭圆形,是ImageView的背景
使用Drawable
:
imageView
获取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));
}
请注意,不需要进行空检查。
但是,如果在其他地方使用它们,则应在修改它们之前在drawable上使用mutate()
。 (默认情况下,从XML加载的drawable共享相同的状态。)
答案 1 :(得分:41)
这样做:
ImageView imgIcon = findViewById(R.id.imgIcon);
GradientDrawable backgroundGradient = (GradientDrawable)imgIcon.getBackground();
backgroundGradient.setColor(getResources().getColor(R.color.yellow));
答案 2 :(得分:15)
如今,一个更简单的解决方案是将您的形状用作背景,然后通过
以编程方式更改其颜色view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_OVER)
编辑:
就像某人在注释中正确指出的那样,如果您的背景有圆角等,您可能想改用PorterDuff.Mode.SRC_ATOP
。
Here's the official documentation,其中包含有关您所使用的不同PorterDuff.Mode
选项的更多详细信息。
答案 3 :(得分:13)
试试这个:
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);
}
有关详细信息,请查看此链接this
希望有所帮助。
答案 4 :(得分:12)
希望这可以帮助有同样问题的人
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);
答案 5 :(得分:9)
扩展Vikram's答案,如果要着色动态视图,例如回收者视图项等等。那么你可能想在设置颜色之前调用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");
}
}
答案 6 :(得分:9)
这个问题在一段时间后得到了解答,但它可以通过重写为kotlin扩展函数来实现现代化。
fun Drawable.overrideColor(@ColorInt colorInt: Int) {
when (this) {
is GradientDrawable -> setColor(colorInt)
is ShapeDrawable -> paint.color = colorInt
is ColorDrawable -> color = colorInt
}
}
答案 7 :(得分:6)
这是适合我的解决方案......也在另一个问题中写道: 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)
答案 8 :(得分: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)
享受。...
答案 9 :(得分:0)
用半径填充形状的简单方法是:
(view.getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);
答案 10 :(得分:0)
什么都不适合我,但是当我设置色调颜色时,它就可以在Shape Drawable上使用
Drawable background = imageView.getBackground();
background.setTint(getRandomColor())
需要android 5.0 API 21
答案 11 :(得分:0)
我的 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")
}
}
答案 12 :(得分: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;
}
}
答案 13 :(得分:0)
更改自定义可绘制对象纯色的最佳方法是 对于 Kotlin。
(findViewById<TextView>(R.id.testing1).getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);