如何使用xml设置颜色可绘制对象的圆角半径?

137

在 Android 网站上,有一个关于颜色绘制资源的部分。在 XML 中定义这些可绘制对象的方式如下所示:

<resources>
    <drawable name="solid_red">#f00</drawable>
    <drawable name="solid_blue">#0000ff</drawable>
    <drawable name="solid_green">#f0f0</drawable>
</resources>
在Java API中,有以下方法可以定义圆角:

setCornerRadius(float radius)

有没有一种方法可以在xml中设置圆角?


要从代码中设置角落,请参见(Gradient Drawables):https://dev59.com/-V7Va4cB1Zd3GeqPNtp0 - samus
3个回答

366

使用<shape>标签在XML中创建一个具有圆角的绘制对象。 (您还可以使用形状标签做其他事情,比如定义颜色渐变)。

这是我在一个应用程序中使用的XML文件副本,用于创建具有白色背景、黑色边框和圆角的绘制对象:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#ffffffff"/>    
             
    <stroke android:width="3dp"
            android:color="#ff000000" />

    <padding android:left="1dp"
             android:top="1dp"
             android:right="1dp"
             android:bottom="1dp" /> 
             
    <corners android:radius="7dp" /> 
</shape>

1
在哪里保存这个文件以及如何在我的Java代码中获取它?谢谢。 - shyam
7
将其保存为可绘制目录下的xml文件,然后像使用任何Drawable(图标或资源文件)一样使用它,使用其资源名称(R.drawable.your_xml_name)。 - Guillaume
30
在这种情况下,所有的半径都是相同的,所以你可以使用 android:radius="7dp"。 - Will Kru
2
此外,如果您单独定义半径(即使值相同),Android Studio中的布局渲染器也无法呈现它,并会给出警告“Pat.isConvex不受支持”。只需使用<corners android:radius="7dp"/>即可。 - Francesco Ambrosini
@shyam 你可以将它设置为“背景”。如果你在 TextView 上使用它,你需要记得添加起始和结束的填充,这样文字就不会被圆角挤压了。 - RowanPD

21

尝试以下代码

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
    android:bottomLeftRadius="30dp"
    android:bottomRightRadius="30dp"
    android:topLeftRadius="30dp"
    android:topRightRadius="30dp" />
<solid android:color="#1271BB" />

<stroke
    android:width="5dp"
    android:color="#1271BB" />

<padding
    android:bottom="1dp"
    android:left="1dp"
    android:right="1dp"
    android:top="1dp" /></shape>

输出


20

mbaird 的答案很好用。只是需要注意的是,在 Android(至少是 2.1 版本)中似乎存在一个 bug,如果将任何单个角的半径设置为 0,则会强制所有角的半径都变为 0(至少对于 "dp" 单位来说如此;我没有尝试过其他单位)。

我需要一个形状,其中顶部角是圆角而底部角是方形的。我通过将我想要成为方形的角度设置为略微大于 0 的值:0.1dp,来实现这一点。这仍然呈现为方形角,但它不会强制其他角的半径为 0。


你刚刚写了 0.1 dp?它能用吗?我也需要上部是圆角下部是方形角,和你一样的问题,我在方形角上使用了 1 dp,在圆角上使用了 10dp。你是对的,虽然仍然有点明显,但现在已经满足了我90%的需求。根据文件设置非圆角处为 0 应该可以的。 - codeScriber
实际上这不是一个 bug,而是在文档中:https://developer.android.com/guide/topics/resources/drawable-resource.html#Shape - Tsuharesu

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