Como defino o raio do canto arredondado de um drawable colorido usando xml?

108

No site do Android, há uma seção sobre drawables coloridos . A definição desses drawables em xml tem a seguinte aparência:

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

Na API Java, eles têm o seguinte método para definir cantos arredondados:

setCornerRadius(float radius)

Existe uma maneira de definir os cantos arredondados no xml?

Jay Askren
fonte
Para definir cantos a partir do código, consulte (Drawables gradiente): stackoverflow.com/questions/8709595/…
samis

Respostas:

319

Use a <shape>tag para criar um drawable em XML com cantos arredondados. (Você pode fazer outras coisas com a tag de forma, como definir um gradiente de cor também).

Aqui está uma cópia de um arquivo XML que estou usando em um de meus aplicativos para criar um drawable com um fundo branco, borda preta e cantos arredondados:

<?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>
Mark B
fonte
1
onde salvar este arquivo e como obtê-lo em meu código java? obrigado
shyam
7
salve-o como um arquivo xml no diretório de drawable e use-o como faria com qualquer drawable (ícone ou arquivo de recurso) usando seu nome de recurso (R.drawable.your_xml_name)
Guillaume
30
neste caso particular, todos os raios são iguais, então você poderia ter usado android: radius = "7dp"
Will Kru
2
Além disso, o renderizador de layout no Android Studio não será capaz de renderizá-lo se você definir o raio separadamente (mesmo com os mesmos valores) e daria um aviso "Pat.isConvex não é suportado". Basta usar <corners android: radius = "7dp" />
Francesco Ambrosini
@shyam Você pode defini-lo como "plano de fundo". Se você usar em um TextView, você precisará se lembrar de adicionar preenchimento para o início e o fim para que o texto não fique
sobrecarregado
19

A resposta de mbaird funciona bem. Esteja ciente de que parece haver um bug no Android (2.1 pelo menos), que se você definir qualquer raio de canto individual para 0, ele força todos os cantos para 0 (pelo menos é o caso com unidades "dp"; tente com quaisquer outras unidades).

Eu precisava de uma forma em que os cantos superiores fossem arredondados e os inferiores quadrados. Consegui isso definindo os cantos que queria que fossem quadrados com um valor um pouco maior que 0: 0,1 dp. Isso ainda é renderizado como cantos quadrados, mas não força os outros cantos a terem raio 0.

John pisello
fonte
você acabou de escrever 0,1 dp? funciona, eu também preciso de cantos arredondados superiores e quadrados inferiores, mesmo problema que você acabou de usar 1 dp, nos cantos quadrados e 10dp nos redondos, você está certo ainda é perceptível, mas me dá 90% do que eu quer, de acordo com a configuração de documentação 0 nos cantos não arredondados deve ter funcionado.
codeScriber
Na verdade, não é um bug, está na documentação: developer.android.com/guide/topics/resources/…
Tsuharesu
1

Experimente o código abaixo

<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>
Mujahid Khan
fonte