Bouton Android standard avec une couleur différente

Je voudrais changer légèrement la couleur d'un bouton Android standard afin de mieux correspondre à la marque d'un client.

La meilleure façon pour ce faire est de changer les Button Drawable à Drawable suivants situé en res/drawable/red_button.xml :

  • Comment désactiver le mode de décalage BottomNavigationView?
  • Comment configurer VPN par programme?
  • Comprendre quelle activité commence en premier dans une application Android
  • SVG vs PNG sur Android
  • Puis-je stocker des fichiers image dans Firebase en utilisant l'API Java
  • ViewPager wrap_content ne fonctionne pas
  •  <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/red_button_pressed" /> <item android:state_focused="true" android:drawable="@drawable/red_button_focus" /> <item android:drawable="@drawable/red_button_rest" /> </selector> 

    Mais cela nécessite que je crée en fait trois jeux différents pour chaque bouton que je veux personnaliser (un pour le bouton au repos, l'un enfoncé et l'autre enfoncé). Cela semble plus compliqué et non-sec, dont j'ai besoin.

    Tout ce que je veux vraiment faire est d'appliquer une sorte de transformation de la couleur au bouton. Existe-t-il un moyen plus simple de modifier la couleur d'un bouton que je le fais?

  • Android WebView Lecture de la vidéo HTML5 / h.264 / mp4, Comment accéder au MediaPlayer
  • Différence entre la vue et le widget
  • Comment transformer une image de côté ou à l'envers?
  • Vérification de l'application Android dans l'application Vérification du reçu dans Dot Net (C #)
  • Erreur avec google_play_services_version value from aar library
  • Erreur: analyse d'erreur XML: pas bien formé (jeton invalide) ...?
  • 18 Solutions collect form web for “Bouton Android standard avec une couleur différente”

    J'ai découvert que tout cela se faisait dans un fichier assez facilement. Mettez quelque chose comme le code suivant dans un fichier nommé custom_button.xml , puis définissez background="@drawable/custom_button" dans votre vue de bouton:

     <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" > <shape> <gradient android:startColor="@color/yellow1" android:endColor="@color/yellow2" android:angle="270" /> <stroke android:width="3dp" android:color="@color/grey05" /> <corners android:radius="3dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> </item> <item android:state_focused="true" > <shape> <gradient android:endColor="@color/orange4" android:startColor="@color/orange5" android:angle="270" /> <stroke android:width="3dp" android:color="@color/grey05" /> <corners android:radius="3dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> </item> <item> <shape> <gradient android:endColor="@color/blue2" android:startColor="@color/blue25" android:angle="270" /> <stroke android:width="3dp" android:color="@color/grey05" /> <corners android:radius="3dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> </item> </selector> 

    Suite à la réponse de Tomasz, vous pouvez également programmer l'ombre de l'intégralité du bouton à l'aide du mode de multiplication PorterDuff. Cela changera la couleur du bouton plutôt que la teinte.

    Si vous commencez par un bouton sombre gris standard:

     button.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY); 

    Vous donnera un bouton rouge ombragé,

     button.getBackground().setColorFilter(0xFF00FF00, PorterDuff.Mode.MULTIPLY); 

    Vous donnera un bouton vert ombragé, etc., où la première valeur est la couleur en format hexadécimal.

    Cela fonctionne en multipliant la valeur de couleur du bouton actuel par votre valeur de couleur. Je suis sûr qu'il y a beaucoup plus que vous pouvez faire avec ces modes.

    Mike, vous pourriez être intéressé par les filtres de couleur.

    Un exemple:

     button.getBackground().setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0xFFAA0000)); 

    Essayez ceci pour obtenir la couleur que vous voulez.

    C'est ma solution qui fonctionne parfaitement à partir de l'API 15 . Cette solution conserve tous les effets de clic de bouton par défaut, comme le matériau RippleEffect . Je ne l'ai pas testé sur des API inférieures, mais cela devrait fonctionner.

    Tout ce que vous devez faire, c'est:

    1) Créer un style qui ne change que colorAccent :

     <style name="Facebook.Button" parent="ThemeOverlay.AppCompat"> <item name="colorAccent">@color/com_facebook_blue</item> </style> 

    Je recommande d'utiliser ThemeOverlay.AppCompat ou votre AppTheme principal en AppTheme que parent, pour garder le reste de vos styles.

    2) Ajoutez ces deux lignes à votre widget de button :

     style="@style/Widget.AppCompat.Button.Colored" android:theme="@style/Facebook.Button" 

    Parfois, votre nouveau colorAccent ne s'affiche pas dans Android Studio Preview, mais lorsque vous lancer votre application sur le téléphone, la couleur sera modifiée.


    Widget bouton d'exemple

     <Button android:id="@+id/sign_in_with_facebook" style="@style/Widget.AppCompat.Button.Colored" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:text="@string/sign_in_facebook" android:textColor="@android:color/white" android:theme="@style/Facebook.Button" /> 

    Bouton d'exemple avec une couleur personnalisée

    Vous pouvez maintenant utiliser AppCompatButton d'appcompat-v7 avec l'attribut backgroundTint :

     <android.support.v7.widget.AppCompatButton xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:backgroundTint="#ffaa00"/> 

    J'aime la suggestion du filtre de couleur dans les réponses précédentes de @conjugatedirection et @Tomasz; Cependant, j'ai constaté que le code fourni jusqu'à présent n'était pas aussi facilement appliqué que prévu.

    Tout d'abord, il n'a pas été mentionné appliquer et effacer le filtre de couleur. Il est possible qu'il y ait d'autres bons endroits pour le faire, mais ce qui est venu à l'esprit pour moi était un OnTouchListener .

    D'après ma lecture de la question initiale, la solution idéale serait celle qui n'implique aucune image. La réponse acceptée à l'aide de custom_button.xml à partir de @emmby est probablement une meilleure adaptation que les filtres de couleur si c'est votre objectif. Dans mon cas, je commence par une image png d'un concepteur d'interface utilisateur de ce que le bouton est censé ressembler. Si je définis l'arrière-plan du bouton sur cette image, la rétroaction en surbrillance par défaut est complètement perdue. Ce code remplace ce comportement par un effet d'assombrissement programmé.

     button.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 0x6D6D6D sets how much to darken - tweak as desired setColorFilter(v, 0x6D6D6D); break; // remove the filter when moving off the button // the same way a selector implementation would case MotionEvent.ACTION_MOVE: Rect r = new Rect(); v.getLocalVisibleRect(r); if (!r.contains((int) event.getX(), (int) event.getY())) { setColorFilter(v, null); } break; case MotionEvent.ACTION_OUTSIDE: case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: setColorFilter(v, null); break; } return false; } private void setColorFilter(View v, Integer filter) { if (filter == null) v.getBackground().clearColorFilter(); else { // To lighten instead of darken, try this: // LightingColorFilter lighten = new LightingColorFilter(0xFFFFFF, filter); LightingColorFilter darken = new LightingColorFilter(filter, 0x000000); v.getBackground().setColorFilter(darken); } // required on Android 2.3.7 for filter change to take effect (but not on 4.0.4) v.getBackground().invalidateSelf(); } }); 

    J'ai extrait ceci comme une classe distincte pour l'application à plusieurs boutons – montré comme classe interne anonyme juste pour obtenir l'idée.

    Si vous créez des boutons de couleur avec XML, vous pouvez rendre le code un peu plus propre en spécifiant l'état focalisé et pressé dans un fichier séparé et en les réutilisant. Mon bouton vert ressemble à ceci:

     <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" android:drawable="@drawable/button_focused"/> <item android:state_pressed="true" android:drawable="@drawable/button_pressed"/> <item> <shape> <gradient android:startColor="#ff00ff00" android:endColor="#bb00ff00" android:angle="270" /> <stroke android:width="1dp" android:color="#bb00ff00" /> <corners android:radius="3dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> </item> </selector> 

    J'utilise cette approche

    Style.xml

     <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:colorPrimaryDark">#413152</item> <item name="android:colorPrimary">#534364</item> <item name="android:colorAccent">#534364</item> <item name="android:buttonStyle">@style/MyButtonStyle</item> </style> <style name="MyButtonStyle" parent="Widget.AppCompat.Button.Colored"> <item name="android:colorButtonNormal">#534364</item> <item name="android:textColor">#ffffff</item> </style> 

    Comme vous pouvez le voir en haut, j'utilise un style personnalisé pour mon bouton. La couleur du bouton correspond à la couleur d'accent. Je trouve cela une approche beaucoup mieux que de définir android:background car je ne perdrai pas l'effet d'ondulation que fournit Google.

    Il y a un moyen beaucoup plus simple maintenant: android-holo-colors.com

    Il vous permettra de changer facilement les couleurs de tous les holo drawables (boutons, filtres, …). Vous sélectionnez la couleur, puis téléchargez un fichier zip contenant des drawables pour toutes les résolutions.

    Utilisez-le de cette façon:

     buttonOBJ.getBackground().setColorFilter(Color.parseColor("#YOUR_HEX_COLOR_CODE"), PorterDuff.Mode.MULTIPLY); 

    Dans <Button> utilisez android:background="#33b5e5" . Ou mieux android:background="@color/navig_button"

    La solution la plus courante qui fonctionne avec n'importe quelle version Android:

     <Button app:backgroundTint="@color/my_color" 

    Notes / Exigences :

    • Utilisez l' app: espace de noms et non l'espace de noms android:
    • Version appcompat> 24.2.0

      Dépendances {compile 'com.android.support:appcompat-v7:25.3.1'}

    Explication : Entrez la description de l'image ici

    La bibliothèque de composants DroidUX dispose d'un widget ColorButton dont la couleur peut être modifiée facilement, à la fois par la définition xml et par programmation au moment de l'exécution, de sorte que vous pouvez même laisser l'utilisateur définir la couleur / le thème du bouton si votre application l'autorise.

    Vous pouvez également utiliser cet outil en ligne pour personnaliser votre bouton http://angrytools.com/android/button/ et utiliser android:background="@drawable/custom_btn" pour définir le bouton personnalisé dans votre mise en page.

    Un moyen simple est de simplement définir une classe de bouton personnalisée qui accepte toutes les propriétés que vous désirez comme le rayon, le dégradé, la couleur pressée, la couleur normale, etc., puis utilisez-la simplement dans vos mises en page XML au lieu de configurer l'arrière-plan à l'aide de XML. Un échantillon est ici

    Ceci est extrêmement utile si vous avez beaucoup de boutons avec les mêmes propriétés, comme le rayon, la couleur sélectionnée, etc. Vous pouvez personnaliser votre bouton hérité pour gérer ces propriétés supplémentaires.

    Résultat (Aucun sélecteur de fond n'a été utilisé).

    Bouton Normal

    Image normale

    Bouton pressé

    Entrez la description de l'image ici

    Vous pouvez définir le thème de votre bouton à ce sujet

     <style name="AppTheme.ButtonBlue" parent="Widget.AppCompat.Button.Colored"> <item name="colorButtonNormal">@color/HEXColor</item> <item name="android:textColor">@color/HEXColor</item> </style> 

    La façon dont je fais un bouton de style différent qui fonctionne très bien est de sous-classer l'objet Button et d'appliquer un filtre de couleur. Cela gère également les états activés et désactivés en appliquant un alpha sur le bouton.

     import android.annotation.TargetApi; import android.content.Context; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.LightingColorFilter; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.os.Build; import android.util.AttributeSet; import android.widget.Button; public class DimmableButton extends Button { public DimmableButton(Context context) { super(context); } public DimmableButton(Context context, AttributeSet attrs) { super(context, attrs); } public DimmableButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @SuppressWarnings("deprecation") @Override public void setBackgroundDrawable(Drawable d) { // Replace the original background drawable (eg image) with a LayerDrawable that // contains the original drawable. DimmableButtonBackgroundDrawable layer = new DimmableButtonBackgroundDrawable(d); super.setBackgroundDrawable(layer); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @Override public void setBackground(Drawable d) { // Replace the original background drawable (eg image) with a LayerDrawable that // contains the original drawable. DimmableButtonBackgroundDrawable layer = new DimmableButtonBackgroundDrawable(d); super.setBackground(layer); } /** * The stateful LayerDrawable used by this button. */ protected class DimmableButtonBackgroundDrawable extends LayerDrawable { // The color filter to apply when the button is pressed protected ColorFilter _pressedFilter = new LightingColorFilter(Color.LTGRAY, 1); // Alpha value when the button is disabled protected int _disabledAlpha = 100; // Alpha value when the button is enabled protected int _fullAlpha = 255; public DimmableButtonBackgroundDrawable(Drawable d) { super(new Drawable[] { d }); } @Override protected boolean onStateChange(int[] states) { boolean enabled = false; boolean pressed = false; for (int state : states) { if (state == android.R.attr.state_enabled) enabled = true; else if (state == android.R.attr.state_pressed) pressed = true; } mutate(); if (enabled && pressed) { setColorFilter(_pressedFilter); } else if (!enabled) { setColorFilter(null); setAlpha(_disabledAlpha); } else { setColorFilter(null); setAlpha(_fullAlpha); } invalidateSelf(); return super.onStateChange(states); } @Override public boolean isStateful() { return true; } } } 

    Valeurs \ styles.xml

     <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> <style name="RedAccentButton" parent="ThemeOverlay.AppCompat.Light"> <item name="colorAccent">#ff0000</item> </style> 

    puis:

     <Button style="@style/Widget.AppCompat.Button.Colored" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="text" /> <Button style="@style/Widget.AppCompat.Button.Colored" android:layout_width="match_parent" android:layout_height="wrap_content" android:enabled="false" android:text="text" /> <Button style="@style/Widget.AppCompat.Button.Colored" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="text" android:theme="@style/RedAccentButton" /> <Button style="@style/Widget.AppCompat.Button.Colored" android:layout_width="match_parent" android:layout_height="wrap_content" android:enabled="false" android:text="text" android:theme="@style/RedAccentButton" /> 

    résultat

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.