以编程方式设置android形状颜色
我正在编辑,使问题更简单,希望有助于准确的答案。
说我有以下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>
如何从活动类中以编程方式设置颜色?
注意 :答案已更新,以涵盖background
是ColorDrawable
的实例的ColorDrawable
。 感谢泰勒普法夫 ,指出这一点。
drawable是一个椭圆形,是ImageView的背景
使用getBackground()
从imageView
获取Drawable
:
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共享相同的状态。)
这样做:
ImageView imgIcon = findViewById(R.id.imgIcon); GradientDrawable backgroundGradient = (GradientDrawable)imgIcon.getBackground(); backgroundGradient.setColor(getResources().getColor(R.color.yellow));
尝试这个:
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); }
有关更多详细信息,请查看此链接
希望有所帮助
希望这会帮助有同样问题的人
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);
这是为我工作的解决scheme…写在另一个问题,以及: 如何dynamic地改变形状的颜色?
//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)
在Vikram的答案上展开,如果你正在为dynamic视图着色,比如回收器视图项目等……那么你可能想要在设置颜色之前调用mutate()。 如果你不这样做,任何有一个共同的drawable(即背景)的意见也将他们drawable改变/着色。
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"); } }
这个问题已经回答了一段时间,但是可以通过改写为kotlin扩展function来实现现代化。
fun Drawable.overrideColor(@ColorInt colorInt: Int) { when (this) { is GradientDrawable -> setColor(colorInt) is ShapeDrawable -> paint.color = colorInt is ColorDrawable -> color = colorInt } }