我目前正在尝试将以下 XML 转换为以编程方式创建,以便我可以在整个项目中根据需要设置顶角和底角。这是一个简单的图层列表,有两个矩形;一个在另一个之上。我想将其用作几个不同视图的背景,因此结果缩放很重要。
<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,具体取决于我想要顶部、底部、两者还是不圆角。
我目前创建相同可绘制对象的尝试只产生了两个矩形,一个在另一个之上。我不知道如何设置矩形的位置。无论形状的边界设置为什么,我都看不到任何可见的变化。任何建议将不胜感激。
// 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);
}
}
}