Android - рисовать с закругленными углами только сверху

152

У меня было это рисовать, чтобы иметь в качестве фона скругленный прямоугольник:

<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 пикселей, но вы знаете, это не решение проблемы.
Кодовый поэт
Вот проблема с углами формы: code.google.com/p/android/issues/detail?id=939
Knickedi

Ответы:

305

Попробуйте дать эти значения:

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

Обратите внимание, что я изменился 0dpна 0.1dp.

РЕДАКТИРОВАТЬ: Смотрите Aleks G комментарий ниже для более чистой версии

AQS
источник
131
Исследуя это далее, я нашел еще лучшее решение: <corners android:radius="1dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>- это дает идеально квадратные нижние углы, даже без намека на округление. Однако ваше решение в значительной степени работает.
Алекс Г
Как это сделать в коде, учитывая растровое изображение? А как добавить контур (обводка АКА) вокруг него?
Android-разработчик
@Aleks G я не вижу необходимости указыватьandroid:radius="1dp"
hmac
@hmac это необходимо. Прочитайте документацию, это ясно дает понять.
Алекс Г
@AleksG Да, документация неверна, тестирование на Samsung 10, Android 9: «Каждый угол должен (изначально) иметь радиус угла больше 1, иначе углы не закругляются. Если вы хотите, чтобы определенные углы не были закруглены, Обходной путь - использовать android: radius для установки радиуса угла по умолчанию больше 1, но затем переопределить "- не так, я задаю нижний правый, верхний правый, верхний левый как ноль и нижний левый + ve и нижний левый правильно изогнут
HMAC
14

Попробуйте сделать что-то вроде этого:

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

Кажется, не подходит для установки другого радиуса угла прямоугольника. Таким образом, вы можете использовать этот взломать.

busylee
источник
Смотрите мой собственный ответ - вполне приемлемо иметь разный радиус для разных углов.
Алекс Г
Я попробовал этот подход, он неприемлем, ide говорит, что он не присваивает другой rsdius и игнорирует его
busylee
11

В моем случае код ниже

    <?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>
Шекхар
источник
1
Свойства top и bottom для элемента не нужны, если вы не хотите использовать отступы в представлении, но в противном случае это работает.
RominaV
9

Основываясь на ответе Бусили , вы можете сделать так, чтобы у вас был 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 - студия (2.0.0p7). Для предварительного просмотра создайте другой вид и используйте его как android:background="@drawable/...".

Dev-Ир
источник
6
@AleksG - Конечно. Это актуально сегодня, как и тогда (как доказательство - мне нужно что-то подобное). Вы должны знать, что с годами некоторые способы ведения дел становятся устаревшими и, возможно, должны быть заменены более современными. Как уже упоминалось, IDE жалуется при определении различных угловых радиусов, что не относится к настоящему способу. Более того, поскольку этот вопрос был моим первым попаданием в Google (iirc), для меня имело смысл обновить его. Во всяком случае, я уверен, что ТАК не будет возражать против еще нескольких КБ кода ... :)
Dev-il
2

Я попробовал ваш код и получил кнопку с закругленными углами. Я дал цвета, как @ffffffи удар, который я дал #C0C0C0.

пытаться

  1. Предоставление Android: bottomLeftRadius = "0.1dp" вместо 0. Если это не работает
  2. Проверьте, что рисовать и разрешение эмулятора. Я создал папку drawable под res и использую ее. (hdpi, mdpi ldpi) папка у вас есть этот XML. это мой вывод.

введите описание изображения здесь

Арул Т
источник
Какая версия для Android это? Мое приложение должно работать на 1.6 - и проблема была в эмуляторе 1.6.
Алекс Г
1

Вам может понадобиться прочитать это https://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

и ниже есть примечание.

Примечание Каждый угол должен (изначально) иметь радиус угла больше 1, иначе углы не закругляются. Если вы хотите, чтобы определенные углы не были скруглены, обходной путь должен использовать android: radius, чтобы установить радиус угла по умолчанию больше 1, но затем переопределить каждый угол значениями, которые вы действительно хотите, обеспечивая ноль ("0dp" ), где вы не хотите закругленные углы.

lightman1988
источник
1

Создайте roung_top_corners.xml на drawable и скопируйте приведенный ниже код

<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>
Маной Редди
источник