Как установить радиус закругленного угла цвета, который можно рисовать с помощью xml?

108

На сайте Android есть раздел о цветных рисунках . Определение этих чертежей в xml выглядит так:

<resources>
    <drawable name="solid_red">#f00</drawable>
    <drawable name="solid_blue">#0000ff</drawable>
    <drawable name="solid_green">#f0f0</drawable>
</resources>

В java api у них есть следующий метод определения закругленных углов:

setCornerRadius(float radius)

Есть ли способ установить закругленные углы в xml?

Джей Аскрен
источник
Чтобы установить углы из кода, см. (Градиентные рисунки): stackoverflow.com/questions/8709595/…
samis

Ответы:

319

Используйте <shape>тег, чтобы создать чертеж в формате XML с закругленными углами. (Вы можете делать и другие вещи с помощью тега формы, например, определять цветовой градиент).

Вот копия XML-файла, который я использую в одном из своих приложений для создания чертежа с белым фоном, черной рамкой и закругленными углами:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#ffffffff"/>    
             
    <stroke android:width="3dp"
            android:color="#ff000000" />

    <padding android:left="1dp"
             android:top="1dp"
             android:right="1dp"
             android:bottom="1dp" /> 
             
    <corners android:radius="7dp" /> 
</shape>
Марк Б
источник
1
где сохранить этот файл и как получить его в моем java-коде? спасибо
shyam
7
сохраните его как файл xml в каталоге с возможностью рисования, а затем используйте его, как если бы вы использовали любой файл с возможностью рисования (значок или файл ресурсов), используя его имя ресурса (R.drawable.your_xml_name)
Гийом
30
в данном конкретном случае все радиусы одинаковы, поэтому вы могли бы использовать android: radius = "7dp"
Уилл Кру
2
Кроме того, средство визуализации макета в Android Studio не сможет отобразить его, если вы определите радиус отдельно (даже с теми же значениями) и выдаст предупреждение «Pat.isConvex не поддерживается». Просто используйте <corners android: radius = "7dp" />
Франческо Амброзини
@shyam Вы можете установить его как "фон". Если вы используете его в TextView, вам нужно не забыть добавить отступы в начале и в конце, чтобы текст не переполнялся закругленными краями
RowanPD
19

Ответ mbaird работает нормально. Просто имейте в виду, что, похоже, в Android есть ошибка (по крайней мере, 2.1): если вы установите радиус любого отдельного угла на 0, он заставит все углы равняться 0 (по крайней мере, так обстоит дело с блоками "dp"; я не не пробую ни с какими другими агрегатами).

Мне нужна была форма, в которой верхние углы были закругленными, а нижние - квадратными. Я добился этого, установив углы, которые я хотел сделать квадратными, на значение немного больше 0: 0,1dp. Это по-прежнему отображается как квадратные углы, но это не заставляет другие углы иметь радиус 0.

Джон Пизелло
источник
ты только что написал 0.1 dp? это работает, мне также нужны верхние закругленные углы и нижние квадратные, та же проблема, что и вы, я использовал 1 dp, на квадратных углах и 10 dp на круглых, вы правы, это все еще заметно, но дает мне 90% того, что я хотите, согласно документации установка 0 на неокругленных углах должна сработать.
codeScriber
На самом деле это не ошибка, это в документации: developer.android.com/guide/topics/resources/…
Tsuharesu 09
1

Попробуйте под кодом

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
    android:bottomLeftRadius="30dp"
    android:bottomRightRadius="30dp"
    android:topLeftRadius="30dp"
    android:topRightRadius="30dp" />
<solid android:color="#1271BB" />

<stroke
    android:width="5dp"
    android:color="#1271BB" />

<padding
    android:bottom="1dp"
    android:left="1dp"
    android:right="1dp"
    android:top="1dp" /></shape>
Муджахид Хан
источник