2013-02-26 12 views
8

現在、次のXMLをプログラムで作成して変換するため、プロジェクト全体で必要に応じて上隅と下隅を設定できます。 2つの矩形を持つ単純なレイヤーリストです。 1つは別のものの上にある。私はいくつかの異なるビューの背景としてこれを使用したいので、結果が拡大することが重要です。角丸でレイヤーリストをプログラムで作成する

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

このアプローチは、作業を行うが、私はトップ、ボトム、両方、又は丸い角のいずれを望むかに応じて、各形状のために別のXMLを必要とします。

私は現在、同じドロアブルを作成しようとしましたが、2つ以上の矩形が1つずつ他のものと重なってしまいました。私は長方形の位置を設定する方法を理解できませんでした。シェイプの境界がどのように設定されているかにかかわらず、私は目に見える変化を見ることができませんでした。どんな提案も大歓迎です。

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

答えて

15

あなたは他の上に1つの矩形を設定することができるようにするためにLayerDrawablesetLayerInsetを探しています。

は、以下を参照してください。

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; 
} 
関連する問題