这个答案,LayerDrawable programmatically,只能帮助提问的人,并没有真正教导任何东西。所以在这里我试图做一些类似需要帮助的事情。
我想要一些非常接近的东西:
没有,因为背景颜色是动态确定的,我发现我无法使用XML drawable来创建它,但我认为它可以通过编程方式完成,但实际上没有任何好的例子可以很好地解释。< / p>
提前致谢!
我的具体问题是如何使用分层drawable创建它。
答案 0 :(得分:2)
下面的类通过自定义ShapeDrawable而不是自定义LayerDrawable实现了您的目标。
请注意,drawLine
调用中坐标的所有偏移都是为了防止重叠,并确保我们看到周边线条的整个宽度。
public class MyShapeDrawable extends ShapeDrawable {
private int startX, startY, endX, endY;
private float mLineWidth = 1f;
private Paint mLinePaint;
public MyShapeDrawable() {
// No color specified, so call constructor with default color White
this(Color.WHITE);
}
public MyShapeDrawable(int color) {
// use the setter defined below, to set the main color for this drawable
setColor(color);
// setup the Paint for drawing the lines
mLinePaint = new Paint();
mLinePaint.setStyle(Paint.Style.STROKE);
mLinePaint.setStrokeWidth(mLineWidth);
}
public void setColor(int color) {
Paint paint = getPaint();
paint.setColor(color);
}
public void setLineWidth(float lineWidth) {
mLineWidth = lineWidth;
mLinePaint.setStrokeWidth(mLineWidth);
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
// bottom black line
////////////////////
mLinePaint.setColor(Color.BLACK);
mLinePaint.setAlpha((int) (255 * 0.9)); // Opacity 90%
canvas.drawLine(
getBounds().left, getBounds().bottom - mLineWidth * 0.5f,
getBounds().right, getBounds().bottom - mLineWidth * 0.5f,
mLinePaint);
// translucent grey rim
///////////////////////
mLinePaint.setColor(Color.parseColor("#888888"));
mLinePaint.setAlpha((int) (255 * 0.7)); // Opacity 70%
// top
canvas.drawLine(
getBounds().left, getBounds().top + mLineWidth * 0.5f,
getBounds().right, getBounds().top + mLineWidth * 0.5f,
mLinePaint);
// left
canvas.drawLine(
getBounds().left + mLineWidth * 0.5f, getBounds().bottom - mLineWidth,
getBounds().left + mLineWidth * 0.5f, getBounds().top + mLineWidth,
mLinePaint);
// right
canvas.drawLine(
getBounds().right - mLineWidth * 0.5f, getBounds().bottom - mLineWidth,
getBounds().right - mLineWidth * 0.5f, getBounds().top + mLineWidth,
mLinePaint);
// top white line
/////////////////
mLinePaint.setColor(Color.WHITE);
mLinePaint.setAlpha((int) (255 * 0.5)); // Opacity 50%
canvas.drawLine(
getBounds().left + mLineWidth, getBounds().top + mLineWidth * 1.5f,
getBounds().right - mLineWidth, getBounds().top + mLineWidth * 1.5f,
mLinePaint);
}
您可以按如下方式使用此课程:
public class Main extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
MyShapeDrawable myShapeDrawable = new MyShapeDrawable(getResources().getColor(R.color.yellow));
FrameLayout frameLayout = (FrameLayout) findViewById(R.id.test);
frameLayout.setBackgroundDrawable(myShapeDrawable);
}
}
答案 1 :(得分:1)
这应该不难。创建您需要的drawable:
ColorDrawable
绘制背景,您可以为此致电setColor()
。ShapeDrawable
创建行。LayerDrawable
。使用setLayerInset()
调整形状,使它们显示为边框。这是您需要做的大致概述。如果需要,我可以发布一些代码以便澄清。