Android - 仅在顶部可绘制圆角

时间:2012-01-19 17:30:56

标签: android drawable rounded-corners

我有这个drawable有一个圆角矩形作为背景:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/white" />
    <stroke android:width="1dp" android:color="@color/light_gray" />
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
    <corners android:radius="6dp" />
</shape>

这正如预期的那样正常。

现在,我想将此更改为仅围绕顶角,因此我将其更改为:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/white" />
    <stroke android:width="1dp" android:color="@color/light_gray" />
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
    <corners android:topLeftRadius="6dp" android:topRightRadius="6dp"
             android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>
</shape>

但是现在没有任何一个角是圆角的,我得到一个普通的矩形。我在这里缺少什么?

10 个答案:

答案 0 :(得分:252)

尝试给出这些值:

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

请注意,我已将0dp更改为0.1dp

编辑:请参阅下面的 Aleks G comment了解更清洁的版本

答案 1 :(得分:13)

尝试做这样的事情:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:bottom="-20dp" android:left="-20dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="20dp" />
        </shape>
    </item>
</layer-list>

似乎不适合设置矩形的不同角半径。所以你可以使用这个黑客。

答案 2 :(得分:8)

busylee's answer的基础上,您可以制作drawable只有一个 un 圆角的示例(在此示例中左上角):

<?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="@color/white" />
            <!-- A numeric value is specified in "radius" for demonstrative purposes only,
                  it should be @dimen/val_name -->
            <corners android:radius="10dp" />
        </shape>
    </item>
    <!-- To keep the TOP-LEFT corner UNROUNDED set both OPPOSITE offsets (bottom+right): -->
    <item
        android:bottom="10dp"
        android:right="10dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
        </shape>
    </item>
</layer-list>

请注意,Android Studio预览版(2.0.0p7)中正确显示上述drawable 。无论如何要预览它,创建另一个视图并将其用作android:background="@drawable/..."

答案 3 :(得分:7)

在我的情况下,代码

    <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:top="10dp" android:bottom="-10dp"
        >

        <shape android:shape="rectangle">
            <solid android:color="@color/maincolor" />

            <corners
                android:topLeftRadius="10dp"
                android:topRightRadius="10dp"
                android:bottomLeftRadius="0dp"
                android:bottomRightRadius="0dp"
            />
        </shape>

    </item>
    </layer-list>

答案 4 :(得分:2)

我尝试了你的代码,得到了一个圆角的按钮。我给出了@ffffff的颜色和我给#C0C0C0的笔画。

尝试

  1. 给予android:bottomLeftRadius =“0.1dp”而不是0.如果它不起作用
  2. 检查drawable和模拟器的分辨率。我在res下创建了一个drawable文件夹并使用它。 (hdpi,mdpi ldpi)你有这个XML的文件夹。 这是我的输出。
  3. enter image description here

答案 5 :(得分:1)

您可能需要阅读此https://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

及以下有注释。

注意每个角必须(最初)提供大于1的角半径,否则没有角是圆角的。如果你想要特定的角不被舍入,一个解决方法是使用android:radius来设置一个大于1的默认角半径,但是然后用你真正想要的值覆盖每个角,提供零(&#34) ; 0dp&#34;)你不想要圆角。

答案 6 :(得分:1)

在drawable上创建roung_top_corners.xml并复制以下代码

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<corners
    android:topLeftRadius="22dp"
    android:topRightRadius="22dp"
    android:bottomLeftRadius="0dp"
    android:bottomRightRadius="0dp"
    />
<gradient
    android:angle="180"
    android:startColor="#1d2b32"
    android:centerColor="#465059"
    android:endColor="#687079"
    android:type="linear" />
<padding
    android:left="0dp"
    android:top="0dp"
    android:right="0dp"
    android:bottom="0dp"
    />
<size
    android:width="270dp"
    android:height="60dp"
    /></shape>

答案 7 :(得分:1)

尝试使用 MaterialShapeDrawable 并在 kotlin/java 代码中对其进行配置。

val backgroundShapeModel = ShapeAppearanceModel.builder()
    .setTopLeftCorner(CornerFamily.ROUNDED, 16F.toPx)
    .setTopRightCorner(CornerFamily.ROUNDED, 16F.toPx)
    .build()
textView.background = MaterialShapeDrawable(backgroundShapeModel).apply {
    fillColor = ColorStateList.valueOf(Color.GREEN)
}

enter image description here

附注:

除了 xml drawables 提供的功能(fillColor、stroke...),MaterialShapeDrawable 还支持:

  1. cornerFamily 分为两类:roundedcut
  2. edgeTreatmentTriangleEdgeTreatmentOffsetEdgeTreatment、...
  3. 不需要上下文和获取资源

enter image description here]

val backgroundShapeModel = ShapeAppearanceModel.builder()
    .setTopLeftCorner(CornerFamily.ROUNDED, 16F.toPx)
    .setTopRightCorner(CornerFamily.CUT, 16F.toPx)
    .setAllEdges(TriangleEdgeTreatment(5f.toPx, true))
    .build()
textView.background = MaterialShapeDrawable(backgroundShapeModel).apply {
    fillColor = ColorStateList.valueOf(Color.GREEN)
    setStroke(2f.toPx,Color.RED)
}

答案 8 :(得分:1)

bg.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF"/>
    <corners android:topLeftRadius="24dp" android:topRightRadius="24dp"
        android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>
</shape>

在您的布局中添加:

android:background="@drawable/bg"

答案 9 :(得分:0)

尝试完全删除这些属性。

android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"