【问题标题】:Android - drawable with rounded corners at the top onlyAndroid - 仅在顶部带有圆角的可绘制
【发布时间】:2012-02-14 09:03:58
【问题描述】:

我有这个drawable有一个圆角矩形作为背景:

<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 像素会有所帮助,但您知道,这不是解决方案。

标签: android drawable rounded-corners


【解决方案1】:

尝试给出这些值:

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

请注意,我已将 0dp 更改为 0.1dp

编辑:请参阅下面的 Aleks G comment 以获得更简洁的版本

【讨论】:

  • 进一步探索,我发现了一个更好的解决方案:&lt;corners android:radius="1dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/&gt; - 这会产生完美的方形底角,甚至没有任何圆角。但是,您的解决方案非常有效。
  • 如何在代码中,给定一个位图?以及如何在它周围添加轮廓(AKA stroke)?
  • @Aleks G 我认为没有必要指定android:radius="1dp"
  • @hmac 这是必要的。阅读文档,它很清楚。
  • @AleksG 是的,文档有误,在三星 10、Android 9 上进行测试:“必须(最初)为每个角提供大于 1 的角半径,否则不会圆角。如果你想要不圆角的特定角,解决方法是使用 android:radius 将默认角半径设置为大于 1,但随后覆盖“-不正确,我将右下角、右上角、左上角指定为零和左下角+ve 和左下角正确弯曲
【解决方案2】:

尝试做这样的事情:

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

似乎不适合设置不同的矩形角半径。所以你可以使用这个技巧。

【讨论】:

  • 查看我自己的答案 - 为不同的角落设置不同的半径是完全可以接受的。
  • 我试过这种方法,不能接受,ide告诉它不适合拥有不同的rsdius并忽略它
【解决方案3】:

在我下面的代码中

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

【讨论】:

  • 不需要项目的顶部和底部属性,除非您想要在视图中添加填充,否则此方法有效。
【解决方案4】:

busylee's answer 的基础上,您可以这样制作一个只有一个un圆角(在本例中为左上角)的drawable

<?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/..."

【讨论】:

  • @AleksG - 当然。今天和当时一样重要(作为证据 - 我需要类似的东西)。您必须知道,多年来,某些做事方式已被弃用,可能需要用更现代的方式替换。正如busylee 提到的,IDE 在定义不同的圆角半径时会报错,而本方法并非如此。此外,由于这个问题是我在 Google (iirc) 上的第一次点击,因此更新它对我来说是有意义的。无论如何,我相信 SO 不会介意再多 KB 的代码... :)
【解决方案5】:
bg.xml

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

添加您的布局:

android:background="@drawable/bg"

【讨论】:

  • 如果您完整阅读该问题,您会发现这不起作用,这就是首先提出该问题的原因。
【解决方案6】:

尝试使用MaterialShapeDrawable并在kotlin/java代码中配置。

val backgroundShapeModel:ShapeAppearanceModel = ShapeAppearanceModel.builder()
    .setTopLeftCorner(CornerFamily.ROUNDED, 16F.toPx)
    .setTopRightCorner(CornerFamily.ROUNDED, 16F.toPx)
    .build()
textView.background = MaterialShapeDrawable(backgroundShapeModel).apply {
    fillColor = ColorStateList.valueOf(Color.GREEN)
}

附注:

除了xml drawables 提供的能力(填充颜色、描边...)之外,MaterialShapeDrawable 还支持:

  1. cornerFamily 分为两个类别:roundedcut
  2. edgeTreatmentTriangleEdgeTreatmentOffsetEdgeTreatment、...
  3. 不需要上下文和获取资源

]

val backgroundShapeModel = ShapeAppearanceModel.builder()
    .setTopLeftCorner(CornerFamily.ROUNDED, 16F.toPx)
    .setTopRightCorner(CornerFamily.CUT, 16F.toPx)
    .setAllEdges(TriangleEdgeTreatment(5f.toPx, true))
    .build()
textView.background = MaterialShapeDrawable(backgroundShapeModel).apply {
    fillColor = ColorStateList.valueOf(Color.GREEN)
    setStroke(2f.toPx,Color.RED)
}

【讨论】:

    【解决方案7】:

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

    试试

    1. 给 android :bottomLeftRadius="0.1dp" 而不是 0。如果它不工作
    2. 检查可绘制对象和模拟器的分辨率。我在 res 下创建了一个可绘制文件夹并使用它。 (hdpi, mdpi ldpi) 你有这个 XML 的文件夹。 这是我的输出。

    【讨论】:

    • 这是什么安卓版本?我的应用程序必须在 1.6 上运行 - 模拟器 1.6 有问题。
    【解决方案8】:

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

    下面有一个注释。

    注意必须(最初)为每个角提供大于 1 的角半径,否则不会圆角。如果您希望特定角不被圆角,解决方法是使用 android:radius 将默认角半径设置为大于 1,然后用您真正想要的值覆盖每个角,提供零(“0dp” ) 你不想要圆角的地方。

    【讨论】:

      【解决方案9】:

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

      【讨论】:

        【解决方案10】:

        尝试完全删除这些属性。

        android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-26
          • 2014-09-02
          • 1970-01-01
          • 2012-05-06
          • 2012-08-21
          • 2019-09-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多