android: shape corners do not work when setting individual corners
I need to have a background which has rounded bottom left/right coners(but not top left/right ones), below is my xml file:
<?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>
But the result is a plain rectangle without any corner rounded, if I only use:
android:radius="12dip"
then all corners are rounded, I searched and found a bug related to this:
http://code.google.com/p/android/issues/detail?id=9161
but the bug states:
Left/right is switched, because android:bottomRightRadius="2dp" turned out to specify left-bottom rounded corner.
which may not be relavent to my issue, I also tried to use:
android:radius="12dip"
followed by
android:topLeftRadius="0dip"
android:topRightRadius="0dip"
without success.
Can anyone help? Thanks!
It seems to be a known issue. Every corner must be >1 or else no corners will be rounded. According to the Android documentation it can be done but it's kind of hacky:
Note: Every corner must (initially) be provided a corner radius greater than 1, or else no corners are rounded. If you want specific corners to not be rounded, a work-around is to use android:radius to set a default corner radius greater than 1, but then override each and every corner with the values you really want, providing zero ("0dp") where you don't want >rounded corners.
See here: http://developer.android.com/guide/topics/resources/drawable-resource.html#corners-element
Change this:
<corners
android:bottomRightRadius="12dp"
android:bottomLeftRadius="12dp"
android:topLeftRadius="0dp"
android:topRightRadius="0dp"/>
to this:
<corners
android:radius="1dp"
android:bottomRightRadius="12dp"
android:bottomLeftRadius="12dp"
android:topLeftRadius="0dp"
android:topRightRadius="0dp"/>
and it should be working as expected.
I found there may be a bug that if you set individual corners, and if any of them is 0, all of them become 0, so in the end I set two of them to 1dip and other two to whatever I need, as none of them is 0, so the bug does not affect it and the result looks good.
The above solutions didn't work for me, but I found a solution online that did work: (https://medium.com/@iamsadesh/android-ui-creating-a-layout-rounded-only-in-the-top-d60514ccab77)
This is for rounding just the top corners:
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
}
try this its work for me.
<?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>
精彩评论