Malheureusement, l'utilisation d'une table d'écriture XML et le remplacement de l'arrière-plan signifient que vous devez définir explicitement la couleur au lieu de pouvoir utiliser les couleurs du style de l'application.
Plutôt que de coder en dur les couleurs des boutons pour chaque comportement, j'ai opté pour le codage en dur du rayon des coins, ce qui est un peu moins compliqué et conserve tous les comportements par défaut des boutons (changement de couleur lorsqu'on appuie dessus et autres effets visuels) et utilise les couleurs du style de l'application par défaut :
-
Définir android:layout_height
y android:layout_width
à la même valeur
-
Définir app:cornerRadius
à la moitié de la hauteur/largeur
(Il semble en fait que tout ce qui est supérieur ou égal à la moitié de la hauteur/largeur fonctionne, donc pour éviter de devoir modifier le rayon à chaque fois que vous mettez à jour la hauteur/largeur, vous pourriez plutôt le définir sur une valeur très élevée, telle que 1000dp
(le risque étant qu'il se brise si ce comportement change un jour).
-
Définir android:insetBottom
y android:insetTop
a 0dp
pour obtenir un cercle parfait
Par exemple :
<Button
android:insetBottom="0dp"
android:insetTop="0dp"
android:layout_height="150dp"
android:layout_width="150dp"
app:cornerRadius="75dp"
/>
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 ?
0 votes
J'ai fait un simple OnDrawn, il s'affiche sur la vue Design, mais quand je veux exécuter l'application, il y a ce problème au chargement : Android.view.InflateException : Fichier XML binaire ligne #52 : Error inflating class com.inaros.magicbox._customButtonPlay