如何在Java代码中创建具有实心、圆角和描边的形状?

21

我有一个在以下xml文件中定义的形状,现在我想通过编程方式更改为纯色。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="#DFDFE0" />

    <corners
        android:bottomLeftRadius="8dp"
        android:bottomRightRadius="8dp"
        android:topLeftRadius="8dp"
        android:topRightRadius="8dp" />

    <stroke
        android:width="3dp"
        android:color="#2E3135" />

</shape>

我认为我应该有一个继承ShapeDrawable并实现onDraw方法的类,有人知道怎么做吗?


1
你可以查看 Resources.getDrawable(int resId) 的源代码,你会发现 Shape 标签指向 GradientDrawable。 - Yugy
@yugy 感谢您的好建议,这是解决此类问题的好方法。 - srain
2个回答

28

最终,我解决了它!

// prepare
int strokeWidth = 5; // 5px not dp
int roundRadius = 15; // 15px not dp
int strokeColor = Color.parseColor("#2E3135");
int fillColor = Color.parseColor("#DFDFE0");

GradientDrawable gd = new GradientDrawable();
gd.setColor(fillColor);
gd.setCornerRadius(roundRadius);
gd.setStroke(strokeWidth, strokeColor);

1
请问如何创建一个圆形? - Lalit Fauzdar
你可以在Kotlin Anko布局中使用context.dip(5)来使用dp。 - Evgenii Vorobei

3
我希望将形状嵌套在另一个形状中,并在内部形状上添加填充...
就像这样:
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#2E3135" />
            <corners
                android:bottomLeftRadius="8dp"
                android:bottomRightRadius="8dp"
                android:topLeftRadius="8dp"
                android:topRightRadius="8dp" />
        </shape>
    </item>
    <item
        android:bottom="3dp"
        android:left="3dp"
        android:right="3dp"
        android:top="3dp">
        <shape android:shape="rectangle">
            <solid android:color="#DFDFE0" />
            <corners
                android:bottomLeftRadius="5dp"
                android:bottomRightRadius="5dp"
                android:topLeftRadius="5dp"
                android:topRightRadius="5dp" />
        </shape>
    </item>
</layer-list>

更新:我发现内部形状的角应该更小,以获得更好的外观...对于不同的比例,您需要测试哪种内半径、外半径和描边大小(填充)最适合您的解决方案。


关于将内部角半径缩小的技巧非常棒。我觉得我的看起来不太对劲,然后我尝试了这个方法,现在它们看起来好多了。谢谢! - Yurelle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接