Android-可绘制,仅在顶部带有圆角


151

我有一个可绘制的背景,有一个圆角的矩形:

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

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


这确实不是解决方案,但我想我曾经遇到过类似的问题。将笔划增加到2像素会有帮助,但是您知道,这不是解决方案。
诗人

这是形状角的问题:code.google.com/p/android/issues/detail?
id=939

Answers:


303

尝试提供以下值:

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

请注意,我已更改0dp0.1dp

编辑:请参阅下面的Aleks G 评论以获得更干净的版本


131
进一步探讨这一点,我发现了一个更好的解决方案:<corners android:radius="1dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>-产生完美的正方形底角,甚至没有任何变圆的痕迹。但是,您的解决方案几乎可以用。
Aleks G 2012年

给定位图,该如何在代码中完成?以及如何在其周围添加轮廓(又称为描边)?
Android开发者

@Aleks G我认为没有必要指定android:radius="1dp"
hmac

@hmac是必要的。阅读说明文件,即可清楚了解。
Aleks G

@AleksG是的,文档是错误的,在Samsung 10,Android 9上进行了测试:“必须(最初)为每个角提供一个大于1的角半径,否则,不对任何角进行圆角处理。如果您希望不对特定角进行圆角处理,解决方法是使用android:radius设置大于1的默认角半径,然后覆盖”-不是,我将右下,右上,左上指定为零,左下+ ve和左下正确弯曲
hmac

14

尝试执行以下操作:

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

似乎不适合设置不同的矩形角半径。因此,您可以使用此技巧。


查看我自己的答案-对于不同的拐角使用不同的半径完全可以接受。
Aleks G 2015年

我尝试过这种方法,这是不可接受的,ide告诉我拥有不同的rsdius并不会忽略它
不忙

11

在我的情况下下面的代码

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

1
除非您希望在视图中使用填充,否则不需要项目的顶部和底部属性,否则可以使用。
RominaV

9

busylee的答案的基础上,这是如何制作drawable仅具有一个圆角(在此示例中为左上角)的a的方法:

<?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.0p7)中无法正确显示。无论如何要预览,请创建另一个视图并将其用作android:background="@drawable/..."


6
@AleksG-当然。今天就和那时一样重要(作为证据-我需要类似的东西)。您必须知道,随着时间的流逝,某些做事方式已经过时,可能需要用更现代的方式来代替。正如忙碌中提到的那样,IDE在定义不同的转角半径时会抱怨,而本方法不是这种情况。而且,由于这个问题是我在Google(iirc)上的第一击,因此对我进行更新很有意义。无论如何,我敢肯定,SO也不会介意再花几KB的代码... :)
Dev-iL

2

我尝试了您的代码,并获得了一个顶部的圆角按钮。我给了我的颜色@ffffff和笔触#C0C0C0

尝试

  1. 如果不起作用,则给android:bottomLeftRadius =“ 0.1dp”而不是0。
  2. 检查哪些可绘制对象以及仿真器的分辨率。我在res下创建了一个drawable文件夹并使用它。(hdpi,mdpi ldpi)拥有此XML的文件夹。这是我的输出。

在此处输入图片说明


这是什么Android版本?我的应用程序必须在1.6上运行-模拟器1.6出现了问题。
Aleks G

1

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

下面有一个注释。

注意必须(最初)为每个角提供大于1的角半径,否则将不对任何角进行圆角处理。如果您不希望对特定的角进行圆角处理,一种变通方法是使用android:radius设置默认的角半径大于1,然后使用您真正想要的值覆盖每个角,并提供零(“ 0dp” )您不希望有圆角的地方。


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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.