如何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>
有用。
对于那些遇到同样问题的人。