为什么我不能创建特定角落的圆形边框?

18

我在我的Android XML布局中使用borderframe.xml作为背景来应用边框。

borderframe.xml文件如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke 
        android:width="1dip" 
        android:color="#ffffff"/>
    <solid 
        android:color="#95865F"/>
    <corners 
        android:radius="10px"/>

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

现在, 如果使用 android:radius="10px",它可以工作,但是当我尝试仅将特定角落变成圆形时,则不起作用。 在log cat中没有任何错误消息,但我在eclipse中发现了错误:

    The graphics preview in the layout editor may not be accurate:
* Different corner sizes are not supported in Path.addRoundRect.

即使在该XML文件中没有填充,我仍然无法看到任何边框。

现在,我应该怎么做呢? 如果我只想为左上角和左下角创建圆角边框,有什么解决方法吗? 谢谢。

4个回答

17

我也遇到了相同的问题。但是我使用了layer-list来解决它。我在这里发布我的答案,希望可以帮助到你。
请检查输出屏幕image 1

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
      <shape 
        android:shape="rectangle">
            <stroke android:width="1dp" android:color="#c1c1c1" />
            <solid android:color="#c1c1c1" />
            <corners android:radius="20dp"/>
        </shape>
   </item>

   <item android:right="20dp"
        >
      <shape 
        android:shape="rectangle">
            <stroke android:width="1dp" android:color="#c1c1c1" />
            <solid android:color="#c1c1c1" />
        </shape>
   </item>

</layer-list>

10

假设你只想要一个左上角是圆角,那么你需要这样做:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
  <corners
      android:radius="20sp"
      android:topRightRadius="0dp"
      android:bottomRightRadius="0dp"
      android:bottomLeftRadius="0dp" />
  <gradient
      android:startColor="@color/logo_blue"
      android:endColor="@color/blue"
      android:angle="0"/>
</shape>

解释:每个角落最初都必须拥有大于1的圆角半径,否则就不会出现圆角效果。如果您想让特定的角不被圆角化,则一种解决方法是使用android:radius设置大于1的默认角半径,然后使用您真正想要的值覆盖每个角度,其中不需要圆角的地方提供零("0dp")。 [来源]

因此,您需要将其定义为可绘制项:

<?xml version="1.0" encoding="UTF-8"?>
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke 
        android:width="1dip" 
        android:color="#ffffff"/>
    <solid 
        android:color="#95865F"/>
    <corners 
       android:radius="10px"
      android:topRightRadius="0dp"
      android:bottomRightRadius="0dp" />

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

更新

来自Android形状可绘制资源文档

android:radius 维度。所有角的半径,作为一个尺寸值或尺寸资源。对于每个角,这个属性将被覆盖。

"被覆盖"是您问题的关键词...


1
好的,谢谢。但是如果形状中没有定义填充,我就无法看到边框。为什么? - Shreyash Mahajan
1
实际上,我在布局的左上角和底部左侧有图像。我认为这就是我无法在那里创建圆形的原因?这样对吗? - Shreyash Mahajan
1
当然可以!现在你可以尝试使用ClipDrawable来裁剪你的图像,但我不知道是否可以使用圆角。无论如何,请更新你的问题...让读者阅读所有这些评论太糟糕了。 - Renaud
我不明白为什么这个答案中有两个代码片段。你是在drawable和其他地方都圆角吗? - Noumenon
第一个示例是从我当时的一个项目中提取的。第二个是对原问题片段的改编。在可绘制对象中,角确实是圆角的,请参见“corners”元素。对于第二个片段,我们将10像素半径应用于除topRightRadius和bottomRightRadius之外的所有角落,这两个角落被特别设置为0dp。清楚吗? - Renaud
显示剩余7条评论

6
我正在使用SDK工具19,平台工具11,并在Android 4.0.3上运行应用程序。以下XML对我有效:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle">
    <solid android:color="#dd000000"/>
    <padding 
        android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
    <corners
        android:bottomLeftRadius="25dp"
        android:bottomRightRadius="25dp"
        android:topLeftRadius="0dp"
        android:topRightRadius="0dp" />
</shape>

Eclipse的警告是关于无法显示预览的问题。在应用程序中,它显示正确。

啊哈。截至目前,使用Android Studio仍然会发生这种情况。 - Thuy Trinh

-1

我在一个论坛上找到了解决方案。我通过注释每个角落并在drawable中添加<corners>来解决了它。下面仅保留了已注释的代码以便理解。

XML 代码-

   <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
        <solid android:color="#fd2149" />
        <stroke android:width="1dip" android:color="#ffd102"/>
      <!--  <corners
            android:bottomLeftRadius="8dp"
            android:bottomRightRadius="8dp"
            android:topLeftRadius="8dp"
            android:topRightRadius="8dp" />
        -->
        <corners android:radius="8dp" />
    </shape>

---编辑- 上面的代码是我在drawable文件夹中的back.xml,如果需要,您可以为同一back.xml添加填充。对于那些新开发人员,back.xml如下从您的布局文件引用

  <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tableLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:textSize="20sp"
    android:scrollbars="vertical"
    android:background="@drawable/back">

希望这能有所帮助。

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