J'ai créé un bouton et je veux ajouter un effet d'entraînement à ce bouton!
J'ai créé un fichier XML de bouton bg: (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'entraînement: (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 l’ajout de l’effet d’ondulation, l’arrière-plan du bouton est transparent, et l’affichage du bouton s’affiche uniquement lorsque vous cliquez dessus, comme suit:
Avant de cliquer
Sur clic
Mais j'ai besoin de la couleur de fond du bouton et de l'effet d'entraînement, .__ J'ai trouvé une partie de ce code dans différents blogs de Stack Overflow, mais cela ne fonctionne toujours pas!
Voici un autre xml pouvant être dessiné pour ceux qui veulent ajouter tous ensemble un fond dégradé, un rayon de coin et un effet d'entraînement:
<?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" />
ajoutez le "?attr/selectableItemBackground"
à l'attribut foreground
de votre vue s'il a déjà un arrière-plan avec Android:clickable="true"
Ajouter un effet/animation à un bouton Android
Il suffit de remplacer 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/animation à un bouton Android
En utilisant cette méthode, vous pouvez personnaliser la couleur de l'effet d'entraînement. Tout d'abord, vous devez créer un fichier XML dans votre répertoire de ressources pouvant être 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éfinir l’arrière-plan du bouton sur le fichier de ressources 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" />
En plus de la solution de Jigar Patel , ajoutez-la au fichier ripple.xml pour éviter un fond 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 ceci ripple.xml comme arrière-plan dans votre bouton:
Android:background="@drawable/ripple"
Lorsque le bouton a un arrière-plan dans le dessin, nous pouvons ajouter un effet d’ondulation au paramètre d’avant-plan. Vérifiez ci-dessous le code qui 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"
/>
Ajouter le paramètre ci-dessous pour l'effet d'entraînement
Android:foreground="?attr/selectableItemBackgroundBorderless"
Android:clickable="true"
Pour référence, voir lien ci-dessous https://madoverandroid.wordpress.com/2017/11/11/how-to-add-ripple-effect-to-an-Android-app/
Si vous ne préfixez pas avec
?android:
, votre application va se bloquer.
Vous devez utiliser "?android:attr/selectableItemBackground"
ou "?android:attr/selectableItemBackgroundBorderless"
, selon vos préférences. Je préfère Borderless
.
Vous pouvez le mettre dans Android:background
ou Android:foreground
pour conserver les propriétés existantes.
L'élément doit avoir Android:clickable="true"
et Android:focusable="true"
pour que cela fonctionne, mais de nombreux éléments, tels que les boutons, ont par défaut true
.
<Button
...
Android:background="@color/white"
Android:foreground="?android:attr/selectableItemBackgroundBorderless"
/>
<TextView
...
Android:background="?android:attr/selectableItemBackgroundBorderless"
Android:clickable="true"
Android:focusable="true"
/>
Ajouter des attributs de premier plan et cliquables a fonctionné pour moi.
<Button
...
Android:background="@color/your_color"
Android:foreground="?attr/selectableItemBackgroundBorderless"
Android:clickable="true" />
Lorsque vous utilisez Android: background, vous remplacez une grande partie du style et de l'aspect d'un bouton par une couleur vierge.
Mise à jour: Depuis la version 23.0.0 d'AppCompat, il existe un nouveau style coloré Widget.AppCompat.Button.A qui utilise colorButtonNormal de votre thème pour la couleur désactivée et colorAccent pour la couleur activée.
Cela vous permet de l'appliquer à votre bouton directement via
<Button
...
style="@style/Widget.AppCompat.Button.Colored" />
Vous pouvez utiliser un dessin dans votre répertoire v21 pour votre arrière-plan, par exemple:
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="?attr/colorControlHighlight">
<item Android:drawable="?attr/colorPrimary"/>
</ripple>
Cela garantira que votre couleur d'arrière-plan est? Attr/colorPrimary et que l'animation d'ondulation par défaut utilise la valeur par défaut? Attr/colorControlHighlight (que vous pouvez également définir dans votre thème si vous le souhaitez).
Remarque: vous devrez créer un sélecteur personnalisé pour une version inférieure à la v21:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@color/primaryPressed" Android:state_pressed="true"/>
<item Android:drawable="@color/primaryFocused" Android:state_focused="true"/>
<item Android:drawable="@color/primary"/>
</selector>
En plus de Sudheesh R
Ajouter un effet/une animation à un bouton Android avec une forme de rectangle de bouton avec un coin
Créer un fichier XML res/drawable/nom_fichier.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="@color/colorWhite"
tools:targetApi="Lollipop">
<item Android:id="@Android:id/mask">
<shape Android:shape="rectangle">
<solid Android:color="@color/colorPrimaryDark" />
<corners Android:radius="50dp" />
</shape>
</item>
<item Android:id="@Android:id/background">
<shape Android:shape="rectangle">
<gradient
Android:angle="90"
Android:endColor="@color/colorAccent"
Android:startColor="@color/colorPrimary"
Android:type="linear" />
<corners Android:radius="50dp" />
</shape>
</item>
</ripple>
essaye ça
<Button
Android:id="@+id/btn_location"
Android:layout_width="121dp"
Android:layout_height="38dp"
Android:layout_gravity="center"
Android:layout_marginBottom="24dp"
Android:layout_marginTop="24dp"
Android:foreground="?attr/selectableItemBackgroundBorderless"
Android:clickable="true"
Android:background="@drawable/btn_corner"
Android:gravity="center_vertical|center_horizontal"
Android:paddingLeft="13dp"
Android:paddingRight="13dp"
Android:text="Save"
Android:textColor="@color/color_white" />
Il suffit d'utiliser:
Android:backgroundTint="#f816a463"
Au lieu de:
Android:background="#f816a463"
N'oubliez pas de changer votre Button
en Android.support.v7.widget.AppCompatButton
Une solution alternative à l'utilisation de la balise <ripple>
(que je préfère personnellement ne pas faire, car les couleurs ne sont pas "par défaut") est la suivante:
Créer un dessin pour l'arrière-plan du bouton et inclure <item Android:drawable="?attr/selectableItemBackground">
dans le <layer-list>
Ensuite (et je pense que c'est la partie la plus importante), définissez par programmation backgroundResource(R.drawable.custom_button)
sur votre occurrence de bouton.
Button btn_temp = view.findViewById(R.id.btn_temp);
btn_temp.setBackgroundResource(R.drawable.custom_button);
<Button
Android:id="@+id/btn_temp"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:background="@drawable/custom_button"
Android:text="Test" />
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape Android:shape="rectangle">
<solid Android:color="@Android:color/white" />
<corners Android:radius="10dp" />
</shape>
</item>
<item Android:drawable="?attr/selectableItemBackground" />
</layer-list>