如何在XML drawable中创建一个带有两个弯曲边的矩形?

时间:2013-08-06 03:09:50

标签: android drawable shapedrawable

我希望矩形的左右两侧(而不是角落)是弯曲的。或者说椭圆形的顶部和底部是直的。

我怎样才能达到这样的目标?

enter image description here

10 个答案:

答案 0 :(得分:11)

在textview上试试这个,对于单个字符,它会显示一个圆圈,对于多个数字,它会自动扩展为你在上面显示的形状,但如果你严格要求上面的形状,只需在左右两侧给出更大的填充

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <padding
        android:top="3dp"
        android:left="8dp"
        android:right="8dp" 
        android:bottom="3dp"/>

    <solid android:color="#E6121A" />

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

</shape> 

答案 1 :(得分:7)

一切正常!

<?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">

    <solid
        android:color="@color/color_red"/>
    <corners
        android:radius="10000dp" /> 
</shape>

答案 2 :(得分:5)

我迟到了,答案一定不能完全完成(我不考虑灵活的高度),但至少如果我们提前知道dp中的高度,诀窍是将半径设为高度的一半的按钮。例如,如果高度为48dp,我们可以执行以下操作:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <solid android:color="#ff0000"/>
    <corners android:radius="24dp" />
</shape>

答案 3 :(得分:1)

我认为最好的想法之一是使用xml fiel创建形状。

创建 Drawable-&gt; ovalshape.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <solid android:color="#ff0000" />

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

    <padding
        android:bottom="5dip"
        android:left="10dip"
        android:right="10dip"
        android:top="5dip" />

</shape>

现在您可以轻松使用此xml instead of image。我认为这对you and new SO user很有帮助。

答案 4 :(得分:0)

尝试将边框半径设置为高度的一半。在CSS中,border-radius:50%会创建一个椭圆,所以我猜如果它只有50%的高度,那么你会得到类似的东西。

答案 5 :(得分:0)

简单的方法是使用9-patch image(以image.9.png结尾的png图像)并使用额外的像素边框来定义如何缩放图像。

另一种方法是在res / drawable文件夹中创建一个形状文件。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <solid android:color="#ff0000"/>
</shape>

有关形状here

的更多信息

答案 6 :(得分:0)

似乎形状允许的最大半径是下方形状中总高度的一半,因此您可以使用它来形成具有灵活高度的形状,以保持欲望比率:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="#ffffff" />
    <size android:height="@dimen/height" />
    <corners
        android:radius="@dimen/height"
        />
</shape>

答案 7 :(得分:0)

定义高度并使半径为半高。

答案 8 :(得分:0)

您可以将半径大小增加到200dp,并将drawable设置为textview的背景

<solid android:color="#E6121A" />

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

答案 9 :(得分:0)

为了让双方始终保持任何高度的曲线,我最终必须以编程方式创建形状,如下所示(Kotlin中的代码)

class CurvedSidesShape : RectShape() {
    override fun draw(canvas: Canvas, paint: Paint?) {
        var path = Path()
        path.addRoundRect(rect(), rect().height(), rect().height(), Path.Direction.CW)
        canvas.drawPath(path, paint)
    }
}

以下是我如何将形状用作按钮背景

class CurvedSidesButton : Button {
    private var mHeight: Int = 0

    constructor(context: Context?) : super(context) {
        init(context, null, 0, 0)
    }

    .
    .
    .

    override fun draw(canvas: Canvas?) {
        setCurvedSidesBackground(height)
        super.draw(canvas)
    }

    private fun setCurvedSidesBackground(height: Int) {
        if (height != mHeight) {
            val curvedSidesShape = ShapeDrawable(CurvedSidesShape())
            curvedSidesShape.intrinsicWidth = width
            curvedSidesShape.intrinsicHeight = height
            curvedSidesShape.paint.color = Color.RED
            background = curvedSidesShape
            mHeight = height
        }
    }
}