221 votes

Bouton circulaire personnalisé

Je veux créer un bouton personnalisé et j'ai besoin qu'il soit circulaire. Comment puis-je créer un bouton circulaire ? Je ne pense pas que cela soit possible avec draw9patch.

Je ne sais pas non plus comment créer un bouton personnalisé !

Avez-vous une suggestion ?

0 votes

Vous devez étendre la classe du bouton et surcharger la méthode onDraw.

2 votes

Mais le problème est que si j'étend cela, et que l'utilisateur touche en dehors du cercle, Onlcick sera appelé, comment résoudre cela ?

0 votes

Pourquoi ne pas simplement définir une image de forme ronde comme arrière-plan de votre bouton ?

378voto

Adil Soomro Points 18868

Utilisez le xml drawable comme ceci :

Enregistrez le contenu suivant en tant que round_button.xml en drawable dossier

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false">
        <shape android:shape="oval">
            <solid android:color="#fa09ad"/>
        </shape>
    </item>
    <item android:state_pressed="true">
        <shape android:shape="oval">
            <solid android:color="#c20586"/>
        </shape>
    </item>
</selector>

Effet matériel Android : Bien que FloatingActionButton est une meilleure option, si vous voulez le faire en utilisant un sélecteur xml, créez un dossier drawable-v21 en res et en sauver un autre round_button.xml avec le xml suivant

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#c20586">
    <item>
        <shape android:shape="oval">
            <solid android:color="#fa09ad"/>
        </shape>
    </item>
</ripple>

Et le définir comme arrière-plan de Button en xml comme ceci :

<Button
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/round_button"
android:gravity="center_vertical|center_horizontal"
android:text="hello"
android:textColor="#fff" />

Important :

  1. Si vous voulez qu'il affiche tous ces états (activé, désactivé, en surbrillance, etc.), vous utiliserez le sélecteur suivant décrit ici .
  2. Vous devez conserver les deux fichiers afin de rendre le dessinable rétrocompatible. Sinon, vous serez confronté à des exceptions bizarres dans les versions précédentes d'Android.

0 votes

Par "drawable folder", vous voulez dire qu'il faut ouvrir un dossier nommé "drawable", ou le sauvegarder dans "drawable-mdpi, hdpi, etc..." ?

0 votes

@Jjang non, vous devez juste l'enregistrer dans le dossier 'drawable', toute ressource xml pour drawable est typiquement enregistrée dans 'drawable', pas dans mdpi, hdpi etc.

0 votes

K thx, je n'avais pas de dossier drawable jusqu'à présent (seulement mdpi, hdpi... et -v21) :)

69voto

Jerome Points 170

Markushi a écrit un widget de bouton circulaire avec des effets étonnants. Cliquez sur aquí !

enter image description here

0 votes

Comment l'utiliser avec une image non circulaire ?

5 votes

Juste une info : la bibliothèque liée dans cette réponse est maintenant obsolète. L'auteur (Markushi) recommande l'utilisation de la bibliothèque Bouton d'action flottant à la place.

0 votes

@ABoschman Peut-on mettre du texte dans le widget du bouton du cercle ? Ou seulement pour les objets à dessiner

35voto

Gabriele Mariotti Points 7243

Avec l'officiel Bibliothèque des composants matériels vous pouvez utiliser le MaterialButton appliquer un Widget.MaterialComponents.Button.Icon le style.

Quelque chose comme :

   <com.google.android.material.button.MaterialButton
            android:layout_width="48dp"
            android:layout_height="48dp"
            style="@style/Widget.MaterialComponents.Button.Icon"
            app:icon="@drawable/ic_add"
            app:iconSize="24dp"
            app:iconPadding="0dp"
            android:insetLeft="0dp"
            android:insetTop="0dp"
            android:insetRight="0dp"
            android:insetBottom="0dp"
            app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.MyApp.Button.Rounded"
            />

Actuellement, le app:iconPadding="0dp" , android:insetLeft , android:insetTop , android:insetRight , android:insetBottom sont nécessaires pour centrer l'icône sur le bouton en évitant tout espace de remplissage supplémentaire.

Utilisez le app:shapeAppearanceOverlay pour obtenir des coins arrondis. Dans ce cas, vous obtiendrez un cercle.

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

Le résultat final :

enter image description here


Avec jetpack compose que vous pouvez utiliser :

    Button(
        onClick = { /* Do something! */ },
        modifier = Modifier.width(48.dp).height(48.dp),
        shape = CircleShape
    ) {
        Icon(Icons.Filled.Add, "")
    }

enter image description here

1 votes

Merci @Gabriele Mariotti. Cela vaut la peine de souligner la nécessité de app:iconPadding="0dp" pour s'assurer que l'icône est centrée. J'ai passé beaucoup de temps à essayer de centrer jusqu'à ce que je trouve ceci. Il semble que ce soit un oubli que app:iconGravity manque une valeur "center".

1 votes

Merci @Gabriele Mariotti. Cela fonctionne bien pour moi !

1 votes

Pour supprimer l'élévation du bouton, on peut utiliser le style suivant : Widget.MaterialComponents.Button.UnelevatedButton.Icon

23voto

Prince Points 1203

AngryTool pour bouton Android personnalisé

Vous pouvez faire n'importe quel type de bouton Android personnalisé avec cet outil... J'ai fait un bouton rond et carré avec un coin rond avec cet outil... Visitez-le peut-être je vais vous aider

8voto

Roberto Leinardi Points 1577

Pour un bouton au look FAB, ce style sur un MaterialButton :

<com.google.android.material.button.MaterialButton
    style="@style/Widget.MaterialComponents.ExtendedFloatingActionButton"
    app:cornerRadius="28dp"
    android:layout_width="56dp"
    android:layout_height="56dp"
    android:text="1" />

Résultat :

enter image description here

Si vous modifiez la taille, veillez à utiliser la moitié de la taille du bouton en tant que app:cornerRadius .

1 votes

Cette solution est géniale

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X