Como fazer os cantos de um botão redondo?


457

Eu quero fazer os cantos de uma buttonrodada. Existe uma maneira fácil de conseguir isso no Android?




11
essa não é uma questão ampla, é absolutamente objetiva. marcá-lo como "muito amplo" é apenas uma mentalidade de SO que precisa ser mudada. Pare de ser ditador.
user734028

2
concordo com user734028: o que diabos como fechar como sendo muito amplo ?? a única maneira de isso ser mais específico se o OP tivesse perguntado como definir o raio do canto para N pixels. Vamos!
nyholku 7/03/19

Respostas:


679

Se você quiser algo assim

Visualização do botão

aqui está o código

1.Crie um arquivo xml na sua pasta drawable como mybutton.xml e cole a seguinte marcação:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true" >
        <shape android:shape="rectangle"  >
            <corners android:radius="3dip" />
            <stroke android:width="1dip" android:color="#5e7974" />
            <gradient android:angle="-90" android:startColor="#345953" android:endColor="#689a92"  />            
        </shape>
    </item>
    <item android:state_focused="true">
        <shape android:shape="rectangle"  >
            <corners android:radius="3dip" />
            <stroke android:width="1dip" android:color="#5e7974" />
            <solid android:color="#58857e"/>       
        </shape>
    </item>  
    <item >
       <shape android:shape="rectangle"  >
            <corners android:radius="3dip" />
            <stroke android:width="1dip" android:color="#5e7974" />
            <gradient android:angle="-90" android:startColor="#8dbab3" android:endColor="#58857e" />            
       </shape>
    </item>
</selector>

2. Agora, use este desenho para o fundo da sua exibição. Se a visualização for botão, algo como isto:

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:textColor="#ffffff"
    android:background="@drawable/mybutton"
    android:text="Buttons" />

Ele caiu: Causada por: org.xmlpull.v1.XmlPullParserException: linha do arquivo XML binário # 24: <item> tag requer um atributo 'drawable' ou criança tag definição de um drawable
Zennichimaro

3
podemos fazer isso programaticamente.
Killer

Ele diz que o seletor de elemento deve ser declarado. EDIT: Desculpe, o arquivo estava dentro da pasta de valores, em vez do drawable. Quando o transferi, funcionou.
F0r3v3r-A-N00b

o que cria a sombra ao clicar? Estou tentando reduzir a largura da sombra na parte inferior ... sem sorte
Neville Nazerane

Não vejo o que mostrar como os seletores são codificados tem a ver com a explicação de como os cantos dos botões devem ser codificados.
TavernSenses

345

Crie um arquivo xml na pasta drawable como abaixo

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" android:padding="10dp">
    <!-- you can use any color you want I used here gray color-->
    <solid android:color="#ABABAB"/> 
    <corners android:radius="10dp"/>
</shape>

Aplique isso como plano de fundo no botão que você deseja arredondar.

Ou você pode usar um raio separado para cada canto, como abaixo

android:bottomRightRadius="10dp"
android:bottomLeftRadius="10dp"
android:topLeftRadius="10dp"
android:topRightRadius="10dp"

57
Você pode apenas encurtar os cantos para Android: raio = "10dp", que se aplicará a todos
Ben Simpson

22
Esta não é uma solução completa, pois não suporta os vários estados dos botões (pressionado, focado, padrão). Para uma solução melhor ver stackoverflow.com/questions/9334618/rounded-button-android
JosephL

3
@ BenSimpson, você verá que há uma diferença na forma quando coloca apenas uma linha em vez de definir cada um dos raios dos cantos individualmente.
Garima Tiwari

isso funciona mais perfeitamente do que a resposta destacada. obrigado um milhão!
Dan Linh

37

Crie um arquivo XML como o abaixo. Defina-o como plano de fundo para o botão. Mude o atributo do raio a seu desejo, se precisar de mais curva para o botão.

button_background.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@color/primary" />
    <corners android:radius="5dp" />
</shape>

Defina o plano de fundo para o seu botão:

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/button_background"/>

30

crie shape.xml na pasta drawable

como shape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
  <stroke android:width="2dp"
    android:color="#FFFFFF"/>
  <gradient 
    android:angle="225"
    android:startColor="#DD2ECCFA"
    android:endColor="#DD000000"/>
<corners
    android:bottomLeftRadius="7dp"
    android:bottomRightRadius="7dp"
    android:topLeftRadius="7dp"
   android:topRightRadius="7dp" />
</shape>

e em myactivity.xml

você pode usar

<Button
    android:id="@+id/btn_Shap"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:text="@string/Shape"
    android:background="@drawable/shape"/>

16

Criar arquivo myButton.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/colorButton"/>
    <corners android:radius="10dp"/>
</shape>

adicione ao seu botão

 <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/myButton"/>

16

Existe uma maneira fácil de conseguir isso no Android?

Sim, hoje existe, e é muito simples.
Basta usar o MaterialButtonna biblioteca de componentes de material com o app:cornerRadiusatributo

Algo como:

    <com.google.android.material.button.MaterialButton
        android:text="BUTTON"
        app:cornerRadius="8dp"
        ../>

insira a descrição da imagem aqui

Basta obter um botão com cantos arredondados.

Você pode usar um dos estilos de botão Material . Por exemplo:

<com.google.android.material.button.MaterialButton
    style="@style/Widget.MaterialComponents.Button.OutlinedButton"
    .../>

insira a descrição da imagem aqui

Também a partir da versão 1.1.0, você também pode alterar a forma do seu botão. Basta usar o shapeAppearanceOverlayatributo no estilo do botão:

  <style name="MyButtonStyle" parent="Widget.MaterialComponents.Button">
    <item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay.MyApp.Button.Rounded</item>
  </style>

  <style name="ShapeAppearanceOverlay.MyApp.Button.Rounded" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSize">16dp</item>
  </style>

Então basta usar:

<com.google.android.material.button.MaterialButton
   style="@style/MyButtonStyle"
   .../>

Você também pode aplicar o shapeAppearanceOverlayno layout xml:

<com.google.android.material.button.MaterialButton
   app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.MyApp.Button.Rounded"
   .../>

O shapeAppearancepermite também ter forma e dimensão diferentes para cada canto:

<style name="ShapeAppearanceOverlay.MyApp.Button.Rounded" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerFamilyTopRight">cut</item>
    <item name="cornerFamilyBottomRight">cut</item>
    <item name="cornerSizeTopLeft">32dp</item>
    <item name="cornerSizeBottomLeft">32dp</item>
</style>

insira a descrição da imagem aqui


Exige também usar tema de materiais
Vlad

@ Vlad Sim, os componentes materiais requerem um tema material.
Gabriele Mariotti

11

A maneira simples que descobri foi criar um novo arquivo xml na pasta drawable e apontar o plano de fundo dos botões para esse arquivo xml. aqui está o código que eu usei:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">

<solid android:color="#ff8100"/>
<corners android:radius="5dp"/>

</shape>

3
Para restaurar o efeito cascata do tema Material no plano de fundo desenhável personalizado, adicione android:foreground="?attr/selectableItemBackground"a exibição de botão. Veja stackoverflow.com/questions/38327188/…
Mr-IDE

11

Crie o arquivo rounded_btn.xml na pasta Drawable ...

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
     <solid android:color="@color/#FFFFFF"/>    

     <stroke android:width="1dp"
        android:color="@color/#000000"
        />

     <padding android:left="1dp"
         android:top="1dp"
         android:right="1dp"
         android:bottom="1dp"
         /> 

     <corners android:bottomRightRadius="5dip" android:bottomLeftRadius="5dip" 
         android:topLeftRadius="5dip" android:topRightRadius="5dip"/> 
  </shape>

e use o arquivo this.xml como pano de fundo do botão

<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/rounded_btn"
android:text="Test" />

7

Este link tem todas as informações necessárias. Aqui

Shape.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape      xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">

    <solid   android:color="#EAEAEA"/>

    <corners    android:bottomLeftRadius="8dip"
                android:topRightRadius="8dip"
                android:topLeftRadius="1dip"
                android:bottomRightRadius="1dip"
                />
</shape>

e main.xml

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">

    <TextView   android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Hello Android from NetBeans"/>

    <Button android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Nishant Nair"
            android:padding="5dip"
            android:layout_gravity="center"
            android:background="@drawable/button_shape"
            />
</LinearLayout>

Isso deve lhe dar o resultado desejado.

Boa sorte


6

botão de estilo com ícone insira a descrição da imagem aqui

   <Button
        android:id="@+id/buttonVisaProgress"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="5dp"
        android:background="@drawable/shape"
        android:onClick="visaProgress"
        android:drawableTop="@drawable/ic_1468863158_double_loop"
        android:padding="10dp"
        android:text="Visa Progress"
        android:textColor="@android:color/white" />

shape.xml

    <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="14dp" />
<gradient
    android:angle="45"
    android:centerColor="#1FA8D1"
    android:centerX="35%"
    android:endColor="#060d96"
    android:startColor="#0e7e1d"
    android:type="linear" />
<padding
    android:bottom="0dp"
    android:left="0dp"
    android:right="0dp"
    android:top="0dp" />
<size
    android:width="270dp"
    android:height="60dp" />
<stroke
    android:width="3dp"
    android:color="#000000" />


4

se você estiver usando drawables vetoriais, basta especificar um elemento <corners> na sua definição drawable. Eu cobri isso em uma postagem no blog .

Se você estiver usando desenhistas de bitmap / 9 patches, precisará criar os cantos com transparência na imagem de bitmap.


0

pasta desenhável

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#FFFFFF"/>
    <corners android:radius="30dp"/>
    <stroke android:width="2dp" android:color="#999999"/>
</shape>

pasta de layout

<Button
    android:id="@+id/button2"
    <!-- add style to avoid square background -->
    style="@style/Widget.AppCompat.Button.Borderless"
    android:background="@drawable/corner_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

certifique-se de adicionar estilo para evitar o fundo quadrado

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.