Je sais comment créer un bouton Material Design avec remplissage de couleur:
style="@style/Widget.AppCompat.Button.Colored"
Et bouton transparent sans bordure:
style="@style/Widget.AppCompat.Button.Borderless.Colored"
Cependant, y a-t-il un moyen de faire un bouton avec bordure (transparent à l'intérieur)? Quelque chose comme ci-dessous?
Voici comment le faire correctement.
Ce que tu dois faire c'est
1 - Créer une forme dessinable avec trait
2 - Créer une ondulation pouvant être dessinée
3 - Créer un sélecteur dessinable pour moins de v21
4 - Créer un nouveau style pour bouton avec bordure
5 - Appliquer le style sur le bouton
1 - Crée une forme avec un traitbtn_outline.xml
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<stroke
Android:width="2dp"
Android:color="@color/colorAccent">
</stroke>
<solid Android:color="@color/colorTransparent"/>
<corners
Android:radius="5dp">
</corners>
</shape>
2 - Crée une ondulation pouvant être dessinéedrawable-v21/bg_btn_outline.xml
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="@color/colorOverlay">
<item>
<shape>
<stroke
Android:width="2dp"
Android:color="@color/colorAccent"/>
<corners Android:radius="5dp"/>
</shape>
</item>
<item Android:id="@Android:id/mask">
<shape>
<stroke
Android:width="2dp"
Android:color="@color/colorAccent"/>
<solid Android:color="@Android:color/white"/>
<corners Android:radius="5dp"/>
</shape>
</item>
</ripple>
Android:id="@Android:id/mask"
est nécessaire pour avoir un retour tactile sur le bouton. Le calque marqué comme masque n’est pas visible à l’écran, c’est juste pour le retour tactile.
3 - Crée un sélecteur pouvant être dessiné pour moins de v21drawable/bg_btn_outline.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/btn_outline" Android:state_pressed="true">
<shape Android:shape="rectangle">
<solid Android:color="@color/colorOverlay"/>
</shape>
</item>
<item Android:drawable="@drawable/btn_outline" Android:state_focused="true">
<shape Android:shape="rectangle">
<solid Android:color="@color/colorOverlay"/>
</shape>
</item>
<item Android:drawable="@drawable/btn_outline"/>
</selector>
4 - Crée un nouveau style pour le bouton avec une bordure Toutes les ressources nécessaires à la création du style sont indiquées ci-dessus. Votre style devrait donc ressembler à cela.
<style name="ButtonBorder" parent="Widget.AppCompat.Button.Colored"/>
<style name="ButtonBorder.Accent">
<item name="Android:background">@drawable/bg_btn_outline</item>
<item name="Android:textColor">@color/colorAccent</item>
<item name="Android:textAllCaps">false</item>
<item name="Android:textSize">16sp</item>
<item name="Android:singleLine">true</item>
</style>
4 - Appliquer le style sur le bouton
<Button
style="@style/ButtonBorder.Accent"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"/>
C'est à peu près tout. Voici un exemple de l'apparence des boutons.
Avec la nouvelle version de Support Library 28.0.0 - alpha1 , la bibliothèque de conception contient maintenant le Material Button
.
Vous pouvez ajouter ce bouton à notre fichier de mise en page avec:
<Android.support.design.button.MaterialButton
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="XXXX"
Android:textSize="18sp"
app:icon="@drawable/ic_Android_white_24dp" />
Vous pouvez personnaliser le bouton avec ces attributs:
app:backgroundTint
: Utilisé pour appliquer une teinte à l'arrière-plan du bouton. Si vous souhaitez modifier la couleur d'arrière-plan du bouton, utilisez cet attribut au lieu de l'arrière-plan.
app:strokeColor
: la couleur à utiliser pour le tracé du bouton
app:strokeWidth
: la largeur à utiliser pour le tracé du boutonÉgalement
Crédits à @NomanRafique pour la réponse détaillée! Cependant, en raison de l'arrière-plan personnalisé, nous avons perdu quelques éléments importants:
Widget.AppCompat.Button
Au cas où vous vous le demanderiez, voici à quoi ressemble l'arrière-plan par défaut: https://Android.googlesource.com/platform/frameworks/support/+/a7487e7/v7/appcompat/res/drawable-v21/abc_btn_colored_material. xml
En réutilisant les encarts, les rembourrages et les sélecteurs de couleur d'origine, nous pouvons, dans un cas simple, obtenir quelque chose comme ceci (toutes les valeurs sont celles par défaut et proviennent du support/de la bibliothèque de matériaux Android):
drawable-v21/bg_btn_outlined.xml
<inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:insetLeft="@dimen/abc_button_inset_horizontal_material"
Android:insetTop="@dimen/abc_button_inset_vertical_material"
Android:insetRight="@dimen/abc_button_inset_horizontal_material"
Android:insetBottom="@dimen/abc_button_inset_vertical_material">
<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="?attr/colorControlHighlight">
<item>
<shape>
<stroke
Android:width="2dp"
Android:color="@color/abc_btn_colored_borderless_text_material"/>
<corners Android:radius="@dimen/abc_control_corner_material"/>
<padding
Android:bottom="@dimen/abc_button_padding_vertical_material"
Android:left="@dimen/abc_button_padding_horizontal_material"
Android:right="@dimen/abc_button_padding_horizontal_material"
Android:top="@dimen/abc_button_padding_vertical_material"/>
</shape>
</item>
<item Android:id="@Android:id/mask">
<shape>
<stroke
Android:width="2dp"
Android:color="@color/abc_btn_colored_borderless_text_material"/>
<solid Android:color="@Android:color/white"/>
<corners Android:radius="@dimen/abc_control_corner_material"/>
</shape>
</item>
</ripple>
</inset>
styles.xml
<style name="Button.Outlined" parent="Widget.AppCompat.Button.Borderless.Colored">
<item name="Android:background">@drawable/bg_btn_outlined</item>
</style>
À ce stade, nous devrions avoir un bouton indiqué qui répond aux contacts, respecte l'état enabled="false"
et est de la même hauteur que le Widget.AppCompat.Button
par défaut:
À partir de là, vous pouvez commencer à personnaliser les couleurs en fournissant votre propre implémentation du sélecteur de couleurs @color/abc_btn_colored_borderless_text_material
.
C’est comme cela que je fais des boutons uniquement avec une bordure et un effet d’entraînement sur Lollipop et les versions supérieures. Tout comme les boutons AppCompat, ceux-ci ont un effet de repli sur les API inférieures (si vous avez besoin d'ondulations sur les API inférieures, vous devez utiliser une bibliothèque externe). J'utilise FrameLayout parce que c'est bon marché. La couleur du texte et de la bordure est noire, mais vous pouvez la changer avec une couleur personnalisée:
<FrameLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_margin="20dp"
Android:background="@drawable/background_button_ghost">
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="?android:selectableItemBackground"
Android:gravity="center"
Android:padding="14dp"
Android:textSize="16sp"
Android:textAllCaps="true"
Android:textStyle="bold"
Android:textColor="@Android:color/black"
Android:text="Text"/>
</FrameLayout>
drawable/background_button_ghost.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<stroke
Android:width="2dp"
Android:color="@Android:color/black"/>
<solid Android:color="@color/transparent"/>
</shape>
Si j'ai oublié quelque chose, laissez un commentaire et je mettrai à jour la réponse.
Simplement vous pouvez utiliser ce code. Il a l'air tellement bon.
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="#ffffff"
Android:orientation="vertical">
<Android.support.v7.widget.AppCompatButton
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:backgroundTint="#F48025"
Android:text="login"
Android:textColor="@color/colorWhite" />
</LinearLayout>
Ici la couleur de la bordure est:
Android:background="#ffffff"
Et la couleur de fond est:
Android:backgroundTint="#F48025"