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

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

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

Но теперь ни один из углов не скруглен, и я получаю простой прямоугольник. Что мне здесь не хватает?


person Aleks G    schedule 19.01.2012    source источник
comment
Это действительно не решение, но я думаю, что когда-то у меня была похожая проблема. Повышение стока до 2 пикселей помогло, но сами понимаете, это не решение.   -  person Code Poet    schedule 19.01.2012
comment
Проблема с углами формы: code.google.com/p/android / issues / detail? id = 939   -  person Knickedi    schedule 19.01.2012


Ответы (10)


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

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

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

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

person aqs    schedule 19.01.2012
comment
Изучая это дальше, я нашел еще лучшее решение: <corners android:radius="1dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/> - это дает идеально квадратные нижние углы без даже намека на закругление. Однако ваше решение в значительной степени работает. - person Aleks G; 20.01.2012
comment
Как это сделать в коде, учитывая растровое изображение? И как добавить контур (также известный как обводка) вокруг него? - person android developer; 31.03.2016
comment
@Aleks G не вижу необходимости указывать android:radius="1dp" - person hmac; 13.08.2019
comment
@hmac надо. Прочтите документацию, там все понятно. - person Aleks G; 13.08.2019
comment
@AleksG Да, документация неверна, тестирование на Samsung 10, Android 9: каждый угол (изначально) должен иметь радиус угла больше 1, иначе углы не будут закруглены. Если вы хотите, чтобы определенные углы не округлялись, можно использовать android: radius для установки радиуса угла по умолчанию больше 1, но затем переопределить - неверно, я указываю нижний правый, верхний правый, верхний левый как ноль и нижний левый + ve и нижний левый правильно изогнутый - person hmac; 14.08.2019
comment
@hmac сначала отметьте дату вопроса. В январе 2012 года его спросили об Android 1.6. Во-вторых, без указания радиуса, он работал на телефонах, но не на многих других. С ним он либо на всех устройствах, на которых я тестировал. - person Aleks G; 14.08.2019
comment
@AleksG Я уверен, что вы уже заметили, что ваш вопрос актуален и по сей день. Не могли бы вы отредактировать вопрос и указать, к какой версии Android он относится (я думаю, это было бы намного лучше, чем если бы читатели делали вывод об этой информации с даты публикации)? Возможно, упоминание об устройстве (ах), над которым нужно работать, также будет полезно будущим читателям. Я бы удалил Android из заголовка в соответствии с современными стандартами SO для тегов вопросов. - person Dev-iL; 29.12.2019

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

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

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

person busylee    schedule 06.04.2015
comment
См. Мой собственный ответ - вполне приемлемо иметь разный радиус для разных углов. - person Aleks G; 06.04.2015
comment
Я пробовал этот подход, он неприемлем, ide говорит, что не подходит для другого rsdius и игнорирует его - person busylee; 06.04.2015

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

    <?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>
person Shekhar    schedule 05.04.2016
comment
Свойства Top и bottom элемента не нужны, если вы не хотите использовать отступ в представлении, но в остальном это работает. - person RominaV; 13.05.2016

Основываясь на ответе занятого лица, вот как вы можете сделать 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/...".

person Dev-iL    schedule 23.01.2016
comment
@AleksG - Конечно. Это актуально сегодня, как было тогда (в качестве доказательства - мне нужно было что-то подобное). Вы должны знать, что с годами некоторые способы работы устаревают и, возможно, их необходимо заменить на более современные. Как упоминалось занятым, IDE жалуется при определении различных угловых радиусов, что не относится к настоящему методу. Более того, поскольку этот вопрос был моим первым попаданием в Google (iirc), для меня имело смысл обновить его. Во всяком случае, я уверен, что ТАК не будет возражать против еще нескольких килобайт кода ... :) - person Dev-iL; 23.01.2016

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"
person Fortran    schedule 11.06.2021
comment
Если вы прочитаете вопрос полностью, вы заметите, что это не работает, и именно поэтому вопрос был задан в первую очередь. - person Aleks G; 11.06.2021
comment
интересно в моем случае работает :) - person Fortran; 11.06.2021

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

пытаться

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

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

person AD14    schedule 19.01.2012
comment
Какая это версия андроида? Мое приложение должно работать на 1.6 - и проблема была в эмуляторе 1.6. - person Aleks G; 20.01.2012

попробуйте использовать MaterialShapeDrawable и настроить его в коде kotlin / java.

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

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

P.S:

Помимо возможностей, которые предоставляет xml drawables (fillColor, stroke ...), MaterialShapeDrawable поддерживает:

  1. cornerFamily в двух категориях: rounded и cut
  2. edgeTreatment с TriangleEdgeTreatment, OffsetEdgeTreatment, ...
  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)
}
person beigirad    schedule 23.03.2021

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

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

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

person lightman1988    schedule 29.05.2016

Создайте файл 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>
person Manoj Reddy    schedule 14.12.2018

Попробуйте полностью удалить эти атрибуты.

android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"
person Adam Śmielewski    schedule 05.03.2021