如何dynamic改变形状颜色?

我有

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#FFFF00" /> <padding android:left="7dp" android:top="7dp" android:right="7dp" android:bottom="7dp" /> </shape> <TextView android:background="@drawable/test" android:layout_height="45dp" android:layout_width="100dp" android:text="Moderate" /> 

所以现在我想要这个形状根据我从Web服务调用返回的信息来改变颜色。 所以它可能是黄色或绿色或红色或任何取决于我从networkingserivce调用收到的颜色。

我怎样才能改变形状的颜色? 基于这些信息?

你可以像这样修改它

 GradientDrawable bgShape = (GradientDrawable)btn.getBackground(); bgShape.setColor(Color.BLACK); 

对我来说,它崩溃,因为getBackground返回一个GradientDrawable而不是一个ShapeDrawable

所以我修改它是这样的:

 ((GradientDrawable)someView.getBackground()).setColor(someColor); 

这适用于我,用一个最初的XML资源:

 example.setBackgroundResource(R.drawable.myshape); GradientDrawable gd = (GradientDrawable) example.getBackground().getCurrent(); gd.setColor(Color.parseColor("#000000")); gd.setCornerRadii(new float[]{30, 30, 30, 30, 0, 0, 30, 30}); gd.setStroke(2, Color.parseColor("#00FFFF"), 5, 6); 

以上结果: http : //i.stack.imgur.com/hKUR7.png

您可以使用Java构build自己的形状。 我为一个像Page Controler这样的iPhone做了这个工作,并在Java中绘制形状:

 /** * Builds the active and inactive shapes / drawables for the page control */ private void makeShapes() { activeDrawable = new ShapeDrawable(); inactiveDrawable = new ShapeDrawable(); activeDrawable.setBounds(0, 0, (int) mIndicatorSize, (int) mIndicatorSize); inactiveDrawable.setBounds(0, 0, (int) mIndicatorSize, (int) mIndicatorSize); int i[] = new int[2]; i[0] = android.R.attr.textColorSecondary; i[1] = android.R.attr.textColorSecondaryInverse; TypedArray a = this.getTheme().obtainStyledAttributes(i); Shape s1 = new OvalShape(); s1.resize(mIndicatorSize, mIndicatorSize); Shape s2 = new OvalShape(); s2.resize(mIndicatorSize, mIndicatorSize); ((ShapeDrawable) activeDrawable).getPaint().setColor( a.getColor(0, Color.DKGRAY)); ((ShapeDrawable) inactiveDrawable).getPaint().setColor( a.getColor(1, Color.LTGRAY)); ((ShapeDrawable) activeDrawable).setShape(s1); ((ShapeDrawable) inactiveDrawable).setShape(s2); } 

希望这可以帮助。 Greez Fabian

  LayerDrawable bgDrawable = (LayerDrawable) button.getBackground(); final GradientDrawable shape = (GradientDrawable) bgDrawable.findDrawableByLayerId(R.id.round_button_shape); shape.setColor(Color.BLACK); 

也许别人需要改变XML的颜色,而不需要像我需要的那样创build多个drawable。 然后创build一个没有颜色的可绘制的圆圈,然后为ImageView指定backgroundTint。

circle.xml

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> </shape> 

并在您的布局

 <ImageView android:layout_width="50dp" android:layout_height="50dp" android:background="@drawable/circle" android:backgroundTint="@color/red"/> 

编辑:

有一个关于这个方法的错误 ,它阻止了它在Android Lollipop 5.0(API级别21)上的工作。 但是已经在新版本中修复了。

这个解决scheme为我使用android sdk v19:

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

如果你有一个像这样的imageView:

  <ImageView android:id="@+id/color_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:src="@drawable/circle_color"/> 

以srcforms给出一个可绘制的形状,你可以使用下面的代码来改变形状的颜色:

 ImageView iv = (ImageView)findViewById(R.id.color_button); GradientDrawable bgShape = (GradientDrawable)iv.getDrawable(); bgShape.setColor(Color.BLACK); 

circle.xml(可绘制)

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#000"/> <size android:width="10dp" android:height="10dp"/> </shape> 

布局

 <ImageView android:id="@+id/circleColor" android:layout_width="15dp" android:layout_height="15dp" android:textSize="12dp" android:layout_gravity="center" android:layout_marginLeft="10dp" android:background="@drawable/circle"/> 

在活动中

  circleColor = (ImageView) view.findViewById(R.id.circleColor); int color = Color.parseColor("#00FFFF"); ((GradientDrawable)circleColor.getBackground()).setColor(color); 

我的形状xml:

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@android:color/transparent" /> <stroke android:width="0.5dp" android:color="@android:color/holo_green_dark"/> </shape> 

我的活动xml:

 <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="cn.easydone.test.MainActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> <TextView android:id="@+id/test_text" android:background="@drawable/bg_stroke_dynamic_color" android:padding="20dp" android:text="asdasdasdasd" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </android.support.design.widget.AppBarLayout> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" android:clipToPadding="false" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

我的活动java:

  TextView testText = (TextView) findViewById(R.id.test_text); ((GradientDrawable)testText.getBackground()).setStroke(10,Color.BLACK); 

结果图片: 结果

我试着罗尼的回答,我的应用程序崩溃。 然后我检查我的可绘制的XML。 它看起来像这样:

 <selector >...</selector> 

。 我把它改为:(也改变了属性)

 <shape> ... </shape> 

有用。

对于那些遇到同样问题的人。