以编程方式创build带圆angular的图层列表

我目前正试图转换下面的XML以编程方式创build,以便我可以在整个项目中根据需要设置顶angular和底angular。 这是一个简单的图层列表,有两个矩形。 一个在另一个之上。 我想用这个作为几个不同意见的背景,所以重要的是结果要扩大。

<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,具体取决于我是希望顶部,底部,还是都不是四舍五入。

我目前的创build相同drawable的尝试只产生了两个矩形,一个在另一个之上。 我无法弄清楚如何设置矩形的位置。 不pipe形状的边界是怎样设置的,我都看不到有什么明显的变化。 任何build议将不胜感激。

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

Solutions Collecting From Web of "以编程方式创build带圆angular的图层列表"

您正在寻找LayerDrawable的setLayerInset ,以便能够在另一个上方设置一个矩形。

见下文:

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