Crear lista de capas con esquinas redondeadas mediante programación

Estoy intentando actualmente convertir el XML siguiente a ser creado programmatically de modo que pueda fijar las esquinas superiores y las esquinas inferiores según lo necesitado a través de mi proyecto. Es una lista simple de la capa que tiene dos rectángulos; Uno encima del otro. Me gustaría usar esto como un fondo para unas pocas vistas diferentes por lo que es importante que el resultado de escalas.

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

Este enfoque funciona, pero necesito un XML separado para cada forma dependiendo de si quiero que la parte superior, inferior, ambos, o ninguna de las esquinas redondeadas.

Mis intentos actuales de crear el mismo dibujable han producido nada más que dos rectángulos con uno encima del otro. No pude averiguar cómo establecer las posiciones de los rectángulos. No podía ver ningún cambio visible, independientemente de cuáles fueran los límites de la forma. Cualquier sugerencia sería muy apreciada.

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

Usted está buscando LayerDrawable de LayerDrawable para poder establecer un rectángulo sobre el otro.

Vea abajo:

 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; } 
  • Accidente de transición de elemento compartido para dispositivos Lollipop
  • Botón - Cambiar el color de fondo al hacer clic
  • Buscar en archivo XML con XPath en Android
  • No se puede crear servicio com.parse.PushService: java.lang.NullPointerException
  • ¿Buenas herramientas para desarrollar una GUI en Android?
  • Android: ¿Crear ListView en XML?
  • ¿El complemento ADT crea automáticamente un archivo de construcción de hormigas?
  • AdView - Falta de adActivity con android: configChanges en AndroidManifest.xml
  • Cómo cambiar Primera letra de cada palabra a mayúsculas en Textview xml
  • Haciendo complejos Android XML Drawables
  • Recursos de importación android de proyecto de biblioteca
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.