以编程方式创建LayeredDrawable

时间:2014-10-02 21:23:33

标签: android

这个答案,LayerDrawable programmatically,只能帮助提问的人,并没有真正教导任何东西。所以在这里我试图做一些类似需要帮助的事情。

我想要一些非常接近的东西:

enter image description here

  1. 它们具有动态指定的背景颜色或#eeeeee(如果未指定颜色)。
  2. 他们有1px边框颜色#888888,不透明度为70%(因此它从背景中采用信封的颜色)
  3. 在该边框内部,顶部有1px白线,50%不透明度。
  4. 底部边框应替换为1px黑线,90%不透明度。
  5. 没有,因为背景颜色是动态确定的,我发现我无法使用XML drawable来创建它,但我认为它可以通过编程方式完成,但实际上没有任何好的例子可以很好地解释。< / p>

    提前致谢!

    我的具体问题是如何使用分层drawable创建它。

2 个答案:

答案 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:

  1. 最好使用ColorDrawable绘制背景,您可以为此致电setColor()
  2. 可以使用ShapeDrawable创建行。
  3. 最后,使用您拥有的可绘制堆栈创建一个LayerDrawable。使用setLayerInset()调整形状,使它们显示为边框。
  4. 这是您需要做的大致概述。如果需要,我可以发布一些代码以便澄清。