How to define ShapeDrawables programmatically?

Android - how to define ShapeDrawables programmatically?

  • What I'm trying to achieve is to use a Drawable with a couple of layers inside it, but control some values at runtime such as the startColor for the gradient. Here's what I have in my_layered_shape.xml: <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="#FF000000" /> <solid android:color="#FFFFFFFF" /> </shape> </item> <item android:top="1dp" android:bottom="1dp"> <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="#FF000000" /> <gradient android:startColor="#FFFFFFFF" android:centerColor="#FFFFFF88" android:endColor="#FFFFFFFF" android:gradientRadius="250" android:centerX="1" android:centerY="0" android:angle="315" /> </shape> </item> </layer-list> And if I use mMyImageView.setBackgroundResource(R.drawable.my_layered_shape) it works. I don't mind splitting the xml if I have to, or doing the whole thing programatically as long as there's a way to get at the various color values. The concept I'm going for programmatically (i.e. my best shot at doing the same in code as this xml) is: Drawable[] layers = new Drawable[2]; ShapeDrawable sd1 = new ShapeDrawable(new RectShape()); sd1.getPaint().setColor(0xFFFFFFFF); sd1.getPaint().setStyle(Style.STROKE); sd1.getPaint().setStrokeWidth(1); // sd1.getPaint().somehow_set_stroke_color? ShapeDrawable sd2 = new ShapeDrawable(new RectShape()); sd2.getPaint().setColor(0xFF000000); sd2.getPaint().setStyle(Style.STROKE); // sd2.getPaint().somehow_set_stroke_color? // sd2.getPaint().somehow_set_gradient_params? layers[0] = sd1; layers[1] = sd2; LayerDrawable composite = new LayerDrawable(layers); mMyImageView.setBackgroundDrawable(composite); Thanks.

  • Answer:

    It seems that is does not work with ShapeDrawable, but take a look at my GradientDrawable example: GradientDrawable gd = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]{Color.RED, Color.GREEN}); gd.setStroke(10, Color.BLUE); You may also need following method: gd.setGradientCenter(float x, float y); gd.setGradientRadius(float gradientRadius);

Carl Whalley at Stack Overflow Visit the source

Was this solution helpful to you?

Related Q & A:

Just Added Q & A:

Find solution

For every problem there is a solution! Proved by Solucija.

  • Got an issue and looking for advice?

  • Ask Solucija to search every corner of the Web for help.

  • Get workable solutions and helpful tips in a moment.

Just ask Solucija about an issue you face and immediately get a list of ready solutions, answers and tips from other Internet users. We always provide the most suitable and complete answer to your question at the top, along with a few good alternatives below.