2011-08-22 12 views
27

Quello che sto cercando di ottenere è utilizzare un Drawable con un paio di livelli al suo interno, ma controllare alcuni valori in fase di esecuzione come ad esempio startColor per il gradiente. Ecco quello che ho in my_layered_shape.xml:Android - come definire ShapeDrawables al livello di programmazione?

<?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> 

E se uso mMyImageView.setBackgroundResource (R.drawable.my_layered_shape) funziona. Non mi dispiace dividere l'xml se necessario, o fare tutto il programma a patto che ci sia un modo per ottenere i vari valori di colore. Il concetto Vado a fare a livello di codice (vale a dire il meglio di me a fare lo stesso in codice come questo xml) è:

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

Grazie.

risposta

25

sembra che sia non funziona con ShapeDrawable, ma dare un'occhiata al mio GradientDrawable esempio:

gd.setGradientCenter(float x, float y); 
gd.setGradientRadius(float gradientRadius); 
+7

stranamente, la classe GradientDrawable non ha il metodo "setPadding", c'è qualche problema? – Palani

+0

Eccellente, ha risolto il mio problema – Goofy

5

solo andando:

GradientDrawable gd = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]{Color.RED, Color.GREEN}); 
gd.setStroke(10, Color.BLUE); 

Potrebbe anche essere necessario metodo seguente lascia questo qui ... Non ancora testato

/** 
* Created by Nedo on 09.04.2015. 
*/ 
public class ShapeBuilder { 

    public static Drawable generateSelectorFromDrawables(Drawable pressed, Drawable normal) { 
     StateListDrawable states = new StateListDrawable(); 
     states.addState(new int[]{ -android.R.attr.state_focused, -android.R.attr.state_pressed, -android.R.attr.state_selected}, normal); 
     states.addState(new int[]{ android.R.attr.state_pressed}, pressed); 
     states.addState(new int[]{ android.R.attr.state_focused}, pressed); 
     states.addState(new int[]{ android.R.attr.state_selected}, pressed); 

     return states; 
    } 

    public static Drawable generateShape(String colorTop, String colorBot, String colorStroke, int stokeSize, float strokeRadius) { 
     int top, bot, stroke; 
     top = Color.parseColor(colorTop); 
     bot = Color.parseColor(colorBot); 
     stroke = Color.parseColor(colorStroke); 

     GradientDrawable drawable = new GradientDrawable(GradientDrawable.Orientation.BOTTOM_TOP, new int[]{top, bot}); 
     drawable.setStroke(stokeSize, stroke); 
     drawable.setCornerRadius(strokeRadius); 

     return drawable; 
    } 

    public static Drawable buildSelectorShapeFromColors(String colorNormalStroke, String colorNormalBackTop, String colorNormalBackBot, 
                 String colorPressedStroke, String colorPressedBackTop, String colorPressedBackBot, 
                 int strokeSize, float strokeRadius) { 

     Drawable pressed = generateShape(colorPressedBackTop, colorPressedBackBot, colorPressedStroke, strokeSize, strokeRadius); 
     Drawable normal = generateShape(colorNormalBackTop, colorNormalBackBot, colorNormalStroke, strokeSize, strokeRadius); 
     return generateSelectorFromDrawables(pressed, normal); 
    } 
} 

Modifica: testato Ora, ha avuto un errore. Devi effettivamente descrivere ogni singolo stato. Se si raggruppano stati, verranno attivati ​​solo se tutti si accelleranno contemporaneamente ...

Problemi correlati