168 votes

Ajouter un effet d'ondulation à mon bouton avec la couleur de fond du bouton ?

J'ai créé un bouton et je veux ajouter un effet d'ondulation à ce bouton !

J'ai créé un fichier XML de bg de bouton : (bg_btn.xml)

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:startColor="#FFFFFF" android:endColor="#00FF00" android:angle="270" />
<corners android:radius="3dp" />
<stroke android:width="5px" android:color="#000000" />
</shape>

Et voici mon fichier d'effet d'ondulation : (ripple_bg.xml)

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="#f816a463"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="#f816a463" />
        </shape>
    </item>
</ripple>

Et voici mon bouton auquel je veux ajouter un effet d'entraînement :

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button"
android:layout_centerHorizontal="true"
android:layout_marginTop="173dp"
android:textColor="#fff"
android:background="@drawable/ripple_bg"
android:clickable="true" />

Mais après avoir ajouté l'effet d'ondulation, l'arrière-plan du bouton est transparent, et le bouton ne s'affiche que lorsqu'on le clique, comme ceci :

Avant de cliquer

Sur le clic

Mais j'ai besoin à la fois de la couleur de fond du bouton et de l'effet d'ondulation, J'ai trouvé une partie de ce code dans différents blogs de Stack Overflow, mais cela ne fonctionne toujours pas !

0 votes

S'il vous plaît, faites des captures d'écran beaucoup plus petites la prochaine fois (redimensionnez avant de télécharger)

0 votes

@user25, vous pouvez aussi simplement ajouter un l o m au lien de l'image. (voir mon édition)

0 votes

Ceux qui ont voulu relayer sur foreground utilisez cette astuce pour assurer la rétrocompatibilité. stackoverflow.com/a/65213848/4694013

248voto

Pei Points 1497

Voici un autre drawable xml pour ceux qui veulent ajouter tous ensemble un fond dégradé, un rayon de coin et un effet d'ondulation :

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/colorPrimaryDark">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorPrimaryDark" />
            <corners android:radius="@dimen/button_radius_large" />
        </shape>
    </item>

    <item android:id="@android:id/background">
        <shape android:shape="rectangle">
            <gradient
                android:angle="90"
                android:endColor="@color/colorPrimaryLight"
                android:startColor="@color/colorPrimary"
                android:type="linear" />
            <corners android:radius="@dimen/button_radius_large" />
        </shape>
    </item>
</ripple>

Ajoutez ceci à l'arrière-plan de votre bouton.

<Button
    ...
    android:background="@drawable/button_background" />

PS : cette réponse fonctionne pour Android api 21 et plus.

13 votes

@pei Comment obtenez-vous ces informations ? Je veux dire comment vous savez qu'il y a un élément XML appelé ripple pour faire ce travail ?

2 votes

C'est l'un des concepts utilisés dans la conception des matériaux. Commencez à taper une nouvelle balise Root dans un drawable xml dans Android Studio, puis vous devriez être en mesure de voir toutes les balises disponibles, y compris ripple .

1 votes

Quelle est l'utilisation de l'article masque ?

213voto

backslashN Points 925

Ajouter le "?attr/selectableItemBackground" de votre vue android:foreground s'il a déjà un arrière-plan avec l'attribut android:clickable="true" .

0 votes

Ne fonctionne pas toujours, mais vous pouvez ajouter un fond à l'effet d'entraînement comme indiqué dans les commentaires de la réponse acceptée

0 votes

J'ai dû recourir à cette solution car j'ai utilisé un arrière-plan personnalisé pour mon bouton. Cela a très bien fonctionné.

0 votes

@ROAR, c'est vrai, mais au moins : " Ce n'est pas une erreur ; l'application ignorera simplement l'attribut. Toutefois, si l'attribut est important pour l'apparence ou la fonctionnalité de votre application, vous devriez envisager de trouver un autre moyen d'obtenir le même résultat avec uniquement les attributs disponibles, puis vous pouvez éventuellement créer une copie de la mise en page dans un dossier layout-vNN qui sera utilisé sur l'API NN ou supérieure où vous pourrez profiter du nouvel attribut." Donc, il fonctionne bien sur les appareils au-dessus de l'API 23 et est ignoré quand il est en dessous (nous pouvons juste tools:ignore="UnusedAttribute ).

81voto

Jigar Patel Points 895

Ajouter un effet d'ondulation/une animation à un bouton Android

Remplacez simplement l'attribut d'arrière-plan de votre bouton par Android:background="?attr/selectableItemBackground" et votre code ressemble à ceci.

      <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/selectableItemBackground"
        android:text="New Button" />

Une autre façon d'ajouter un effet d'ondulation/une animation à un bouton Android

Grâce à cette méthode, vous pouvez personnaliser la couleur de l'effet d'ondulation. Tout d'abord, vous devez créer un fichier xml dans le répertoire de vos ressources de dessin. Créez un fichier ripple_effect.xml et ajoutez le code suivant. res/drawable/ripple_effect.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="#f816a463"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="#f816a463" />
        </shape>
    </item>
</ripple>

Et définissez l'arrière-plan du bouton dans le fichier de ressources dessinables ci-dessus.

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/ripple_effect"
    android:padding="16dp"
    android:text="New Button" />

1 votes

Pour moi, l'effet d'ondulation n'est pas apparu. C'était juste un changement de couleur pour le bouton :/ Ma version d'Android est 5.1.1 donc ça devrait fonctionner. Pourriez-vous m'aider ? J'ai suivi vos étapes

0 votes

Android:color doit être différent du mât Android:color, ou vous voulez voir l'effet d'entraînement.

3 votes

Si vous voulez un fond, il suffit d'ajouter un autre élément à l'ondulation, comme : <item Android:drawable="?attr/colorPrimary"/>

45voto

Sudheesh R Points 912

En plus de Jigar Patel ajoutez cette solution à l ripple.xml pour éviter un arrière-plan transparent des boutons.

<item
    android:id="@android:id/background"
    android:drawable="@color/your-color" />

Complete xml :

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="@color/your-color"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="@color/your-color" />
        </shape>
    </item>
    <item
        android:id="@android:id/background"
        android:drawable="@color/your-color" />
</ripple>

Utilisez cette ripple.xml comme fond dans votre bouton :

android:background="@drawable/ripple"

3 votes

Nous n'avons pas eu besoin d'utiliser le <item android:id="@android:id/mask"> [...] . Sauf si vous voulez un masque ovale. Merci pour votre réponse !

0 votes

Que fait ce <item Android:id="@Android:id/mask"> de toute façon, j'ai créé 2 éléments similaires avec et sans cet attribut, et ils sont exactement les mêmes

0 votes

@SartherisStormhammer de la documentation officielle : Si un calque de masque est défini, l'effet d'ondulation sera masqué contre ce calque avant d'être dessiné sur le composite des calques enfants restants. Si aucune couche de masque n'est définie, l'effet d'ondulation est masqué sur le composite des couches enfant. Voici le lien, developer.Android.com/reference/Android/graphics/drawable/

40voto

Jasmine John Points 454

Lorsque le bouton a un arrière-plan provenant du drawable, nous pouvons ajouter un effet d'ondulation au paramètre de premier plan Vérifiez le code ci-dessous, il fonctionne pour mon bouton avec un arrière-plan différent.

    <Button
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    android:gravity="center"
    android:layout_centerHorizontal="true"                                                             
    android:background="@drawable/shape_login_button"
    android:foreground="?attr/selectableItemBackgroundBorderless"
    android:clickable="true"
    android:text="@string/action_button_login"
     />

Ajoutez le paramètre ci-dessous pour l'effet d'ondulation

   android:foreground="?attr/selectableItemBackgroundBorderless"
   android:clickable="true"

Pour référence, voir le lien ci-dessous https://jascode.wordpress.com/2017/11/11/how-to-add-ripple-effect-to-an-Android-app/

3 votes

L'attribut Android:foreground n'a aucun effet sur les niveaux d'API inférieurs à 23.

1 votes

L'inconvénient de cette approche est que, même si le fond de mon bouton était ovale, l'ondulation s'est propagée jusqu'aux bords rectangulaires.

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