Android-可绘制的圆角只在顶部

我画了一个圆角矩形作为背景:

<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>

但是现在没有一个角是圆的,我得到了一个简单的矩形。我错过了什么呢?

166860 次浏览

试着给出这些价值观:

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

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

编辑: 见下面的 Aleks G 评论清洁版

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

试试看

  1. 给机器人: bottomLeftRadius = “0.1 dp”而不是0。如果它不工作
  2. 检查什么是可绘制的,以及模拟器的分辨率。我在 res 下创建了一个可绘制的文件夹并使用它。(hdpi,mdpi ldpi)您拥有这个 XML 的文件夹。 这是我的输出。

enter image description here

试着这样做:

<?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>

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

Busylee 的回答的基础上,如何制作一个只有一个 圆角的 drawable(本例中为左上角) :

<?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>

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

在我的情况下,代码以下

    <?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>

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

下面是一张纸条。

注意每个角必须(最初)提供一个大于1的角半径,否则没有任何角是圆角。如果你不想圆角,一个解决方案是使用 android: 桡指定一个默认的角半径大于1,然后覆盖每一个你真正想要的值,在你不想要圆角的地方提供零(“0dp”)。

在可绘制的环境下创建 round _ 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>

尝试完全删除这些属性。

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

尝试使用 MaterialShapeDrawable并在 kotlin/java 代码中配置它。

val backgroundShapeModel:ShapeAppearanceModel = 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可画性提供的能力(filColor,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)
}
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"