Lo que estoy tratando de lograr es utilizar un Drawable con un par de capas dentro de él, pero controlar algunos valores en tiempo de ejecución como el startColor para el degradado. Esto es lo que tengo en my_layered_shape.xml:Android: ¿cómo definir ShapeDrawables programmatically?
<?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>
Y si uso mMyImageView.setBackgroundResource (R.drawable.my_layered_shape) funciona. No me importa dividir el xml si tengo que hacerlo, o hacer todo el trabajo programáticamente siempre que haya una manera de obtener los distintos valores de color. El concepto voy por programación (es decir, mi mejor oportunidad de hacer lo mismo en código como este XML) es:
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);
Gracias.
curiosamente, la clase GradientDrawable no tiene el método 'setPadding', ¿hay algún problema? – Palani
Excelente, resolvió mi problema – Goofy