2013-02-26 16 views
8

Attualmente sto provando a convertire il seguente XML da creare a livello di codice in modo da poter impostare gli angoli superiori e gli angoli inferiori come necessario durante il mio progetto. È una semplice lista di livelli che ha due rettangoli; uno sopra l'altro. Vorrei utilizzare questo come sfondo per alcune visualizzazioni diverse, quindi è importante che il risultato sia scalabile.Creazione di un elenco di livelli con angoli arrotondati a livello di codice

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:bottom="20dp"> 
     <shape android:shape="rectangle" > 
      <size android:height="20dp" /> 
      <solid android:color="#969595" /> 
      <corners 
       android:radius = "0dp" 
       android:topLeftRadius="5dp" 
       android:topRightRadius="5dp" /> 
     </shape> 
    </item> 
    <item android:top="20dp"> 
     <shape android:shape="rectangle" > 
      <size android:height="20dp" /> 
      <solid android:color="#7B7979" /> 
      <corners 
       android:radius = "0dp" 
       android:bottomLeftRadius="5dp" 
       android:bottomRightRadius="5dp" /> 
     </shape> 
    </item> 
</layer-list> 

Questo approccio funziona, ma ho bisogno di un XML separato per ogni forma a seconda che voglio alto, in basso, entrambi, o nessuno degli angoli arrotondati.

i miei tentativi attuali di creare lo stesso drawable non hanno prodotto niente più di due rettangoli con uno sopra l'altro. Non riuscivo a capire come impostare le posizioni dei rettangoli. Non ho visto alcun cambiamento visibile a prescindere da quali fossero i limiti della forma impostati. Ogni suggerimento sarà molto apprezzato.

// Usage: 
setBackgroundDrawable(new DualColorStateDrawable(0, 10f)); 

...

private final int topColorUnselected = Color.RED; 
private final int bottomColorUnselected = Color.GREEN; 
private final int topColorSelected = Color.YELLOW; 
private final int bottomColorSelected = Color.BLUE; 
private final int m_nZERO_RADIUS = 0; 

class DualColorStateDrawable extends StateListDrawable 
{ 
    public NYWTableViewCellStateDrawable(float topRadius, float bottomRadius){ 
     addState(new int[] { -android.R.attr.state_pressed }, 
       createListWithSelectedState(false, topRadius, bottomRadius)); 
     addState(new int[] { android.R.attr.state_pressed }, 
       createListWithSelectedState(true, topRadius, bottomRadius)); 
    } 

    public Drawable createListWithSelectedState(
     boolean isSelected, float topRadius, float bottomRadius){ 

     int topColor, bottomColor; 

     if (isSelected) { 
      topColor = topColorSelected; 
      bottomColor = bottomColorSelected; 
     } else { 
      topColor = topColorUnselected; 
      bottomColor = bottomColorUnselected; 
     } 

     int x = 10; 
     int y = 10; 
     int width = 20; 
     int height = 20; 

     RoundRectShape _rrsTopShape = 
      new RoundRectShape(getRadii(topRadius, m_nZERO_RADIUS), null, null); 
     CustomShapeDrawable _csdTopShape = 
      new CustomShapeDrawable(_rrsTopShape, topColor); 
     RoundRectShape _rrsBottomShape = 
      new RoundRectShape(getRadii(m_nZERO_RADIUS, bottomRadius), null, null); 
     CustomShapeDrawable _csdBottomShape = 
      new CustomShapeDrawable(_rrsBottomShape, bottomColor); 
     _csdBottomShape.setBounds(x, y, x + width, y + height); 

     return new LayerDrawable(new Drawable[] {_csdTopShape, _csdBottomShape}); 
    } 

    private float[] getRadii(float top, float bottom) 
    { 
     return new float[] { top, top, // 
       top, top, // 
       bottom, bottom, // 
       bottom, bottom // 
     }; 
    } 

    class CustomShapeDrawable extends ShapeDrawable { 
     private final Paint fillpaint; 

     public CustomShapeDrawable(Shape s, int fill) { 
      super(s); 
      fillpaint = new Paint(this.getPaint()); 
      fillpaint.setColor(fill); 
     } 

     @Override 
     protected void onDraw(Shape shape, Canvas canvas, Paint paint) { 
      shape.draw(canvas, fillpaint); 
     } 
    } 
} 

risposta

15

Siete alla ricerca di LayerDrawable s' setLayerInset al fine di essere in grado di impostare un rettangolo sopra l'altro.

vedere qui sotto:

float radius = 5.0f; 

float[] m_arrfTopHalfOuterRadii = 
    new float[] {radius, radius, radius, radius, 0, 0, 0, 0}; 
float[] m_arrfBottomHalfOuterRadii = 
    new float[] {0, 0, 0, 0, radius, radius, radius, radius}; 

int m_nTopColor = Color.BLUE; 
int m_nBottomColor = Color.CYAN; 

int m_nCellHeight = 40; 

public Drawable drawbg() 
{ 
    RoundRectShape top_round_rect = 
     new RoundRectShape(m_arrfTopHalfOuterRadii, null, null); 
    ShapeDrawable top_shape_drawable = new ShapeDrawable(top_round_rect); 
    top_shape_drawable.getPaint().setColor(m_nTopColor); 

    RoundRectShape bottom_round_rect = 
     new RoundRectShape(m_arrfBottomHalfOuterRadii, null, null); 
    ShapeDrawable bottom_shape_drawable = new ShapeDrawable(bottom_round_rect); 
    bottom_shape_drawable.getPaint().setColor(m_nBottomColor); 

    Drawable[] drawarray = {top_shape_drawable, bottom_shape_drawable}; 
    LayerDrawable layerdrawable = new LayerDrawable(drawarray); 

    int _nHalfOfCellHeight = m_nCellHeight/2; 
    layerdrawable.setLayerInset(0, 0, 0, 0, _nHalfOfCellHeight); //top half 
    layerdrawable.setLayerInset(1, 0, _nHalfOfCellHeight, 0, 0); //bottom half 

    return layerdrawable; 
}