android:设置单个角时,形状角不起作用

时间:2011-05-24 03:55:49

标签: android

我需要有一个背景为圆底左/右锥形(但不是左上/右上),下面是我的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape android:shape="rectangle" android:padding="1dp">
        <solid android:color="#FFbdbebd"/>
        <corners
            android:bottomLeftRadius="12dip"
            android:bottomRightRadius="12dip"
            android:topLeftRadius="0dip"
            android:topRightRadius="0dip"/>
    </shape>
</item>
</layer-list>

但是如果我只使用:

,结果是一个没有任何圆角的普通矩形
android:radius="12dip"

然后所有角落都是圆形的,我搜索并找到了与此相关的错误:

http://code.google.com/p/android/issues/detail?id=9161

但错误说明:

  

左/右切换,因为android:bottomRightRadius =“2dp”结果指定左下角圆角。

这可能与我的问题无关,我也尝试使用:

android:radius="12dip"

接着是

android:topLeftRadius="0dip"
android:topRightRadius="0dip"

没有成功。

有人可以帮忙吗?谢谢!

5 个答案:

答案 0 :(得分:6)

这似乎是一个已知问题。每个角落必须> 1,否则没有角落会变圆。根据Android文档,它可以完成,但它有点hacky:

  

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

见这里: http://developer.android.com/guide/topics/resources/drawable-resource.html#corners-element

答案 1 :(得分:6)

改变这个:

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

到此:

 <corners 
        android:radius="1dp"
        android:bottomRightRadius="12dp" 
        android:bottomLeftRadius="12dp"
        android:topLeftRadius="0dp" 
        android:topRightRadius="0dp"/>

它应该按预期工作。

答案 2 :(得分:2)

我发现可能存在一个错误,如果你设置了单个角落,如果它们中的任何一个为0,它们都变为0,所以最后我将它们中的两个设置为1dip,将其他两个设置为我需要的任何一个,因为它们都不是0,所以bug不会影响它,结果看起来很好。

答案 3 :(得分:0)

上述解决方案不适用于我,但我在网上找到了一个可行的解决方案:(https://medium.com/@iamsadesh/android-ui-creating-a-layout-rounded-only-in-the-top-d60514ccab77

这仅用于舍入上角:

val image = findViewById<ImageView>(R.id.image)
val curveRadius = 20F

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

    image.outlineProvider = object : ViewOutlineProvider() {

        @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
        override fun getOutline(view: View?, outline: Outline?) {
            outline?.setRoundRect(0, 0, view!!.width, (view.height+curveRadius).toInt(), curveRadius)
        }
    }

    image.clipToOutline = true

}

答案 4 :(得分:-10)

为我尝试这项工作。

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