【问题标题】:Create layer list with rounded corners programmatically以编程方式创建带圆角的图层列表
【发布时间】:2013-02-12 14:02:54
【问题描述】:

我目前正在尝试将以下 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);
        }
    }
}

【问题讨论】:

    标签: android xml drawing shape layer-list


    【解决方案1】:

    您正在寻找LayerDrawablesetLayerInset 以便能够将一个矩形设置在另一个矩形之上。

    见下文:

    float radius = 5.0f;
    
    float[] m_arrfTopHalfOuterRadii = 
        new float[] {radius, radius, radius, radius, 0, 0, 0, 0};
    float[] m_arrfBottomHalfOuterRadii = 
        new float[] {0, 0, 0, 0, radius, radius, radius, radius};
    
    int m_nTopColor = Color.BLUE;
    int m_nBottomColor = Color.CYAN;
    
    int m_nCellHeight = 40;
    
    public Drawable drawbg()
    {
        RoundRectShape top_round_rect = 
            new RoundRectShape(m_arrfTopHalfOuterRadii, null, null);
        ShapeDrawable top_shape_drawable = new ShapeDrawable(top_round_rect);
        top_shape_drawable.getPaint().setColor(m_nTopColor); 
    
        RoundRectShape bottom_round_rect = 
            new RoundRectShape(m_arrfBottomHalfOuterRadii, null, null);
        ShapeDrawable bottom_shape_drawable = new ShapeDrawable(bottom_round_rect);
        bottom_shape_drawable.getPaint().setColor(m_nBottomColor);
    
        Drawable[] drawarray = {top_shape_drawable, bottom_shape_drawable};
        LayerDrawable layerdrawable = new LayerDrawable(drawarray);
    
        int _nHalfOfCellHeight = m_nCellHeight/2; 
        layerdrawable.setLayerInset(0, 0, 0, 0, _nHalfOfCellHeight); //top half
        layerdrawable.setLayerInset(1, 0, _nHalfOfCellHeight, 0, 0); //bottom half
    
        return layerdrawable;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      相关资源
      最近更新 更多