Obecnie próbuję przekonwertować poniższy kod XML, aby został utworzony programowo, tak aby ustawić górne rogi i dolne rogi zgodnie z potrzebami w całym projekcie. Jest to prosta lista warstw, która ma dwa prostokąty; jeden na drugim. Chciałbym użyć tego jako tła dla kilku różnych widoków, dlatego ważne jest, aby wynik był skalowany.Programowo programuj listę warstw z zaokrąglonymi narożnikami.
<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>
Podejście to działa ale ja potrzebuje oddzielnego XML dla każdego kształtu w zależności od tego, czy chcę góra, dół, oba, albo żaden z krawędzie zaokrąglone.
Moje obecne próby utworzenia tego samego losowania dały tylko dwa prostokąty, jeden na drugim. Nie mogłem wymyślić, jak ustawić położenia prostokątów. Nie widziałem widocznych zmian, niezależnie od tego, do czego zostały ustalone granice kształtu. Wszelkie sugestie będą bardzo mile widziane.
// 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);
}
}
}