Ich versuche derzeit, das folgende XML zu konvertieren, um programmgesteuert erstellt zu werden, damit ich die oberen Ecken und unteren Ecken nach Bedarf in meinem Projekt festlegen kann. Es ist eine einfache Layer-Liste mit zwei Rechtecken. übereinander. Ich möchte dies als Hintergrund für ein paar verschiedene Ansichten verwenden, daher ist es wichtig, dass das Ergebnis skaliert.Erstellen Sie Ebenenliste mit abgerundeten Ecken programmgesteuert
<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>
Dieser Ansatz funktioniert, aber ich brauche eine separate XML für jede Form je nachdem, ob ich die Spitze wollen, unten, beide oder keine der Ecken abgerundet.
meine derzeitigen Versuche, das gleiche Zeichen zu erstellen, haben nichts mehr als zwei Rechtecke ergeben, die übereinander liegen. Ich konnte nicht herausfinden, wie man die Positionen der Rechtecke einstellt. Ich konnte keine sichtbaren Änderungen feststellen, unabhängig davon, wo die Grenzen der Form festgelegt waren. Irgendwelche Vorschläge würden sehr geschätzt werden.
// 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);
}
}
}