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
Related Q & A:
- How to attach components programmatically to GroupBox?Best solution by Stack Overflow
- How to find your location on android programmatically?Best solution by Stack Overflow
- Android::How to Create an app for a book?Best solution by Stack Overflow
- Android: How to parse JSON file with Gson Library?Best solution by Stack Overflow
- how to define event to javascript/jquery?Best solution by Stack Overflow
Just Added Q & A:
- How many active mobile subscribers are there in China?Best solution by Quora
- How to find the right vacation?Best solution by bookit.com
- How To Make Your Own Primer?Best solution by thekrazycouponlady.com
- How do you get the domain & range?Best solution by ChaCha
- How do you open pop up blockers?Best solution by Yahoo! Answers
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.