Effet d’entraînement sur Android Lollipop CardView

J’essaie d’obtenir un CardView pour afficher l’effet d’ondulation lorsqu’il est touché en définissant l’atsortingbut android: backgound dans le fichier XML d’activité, comme décrit ici sur la page Développeurs Android, mais cela ne fonctionne pas. Aucune animation du tout, mais la méthode dans onClick est appelée. J’ai aussi essayé de créer un fichier ripple.xml comme suggéré ici , mais le même résultat.

Le CardView tel qu’il apparaît dans le fichier XML de l’activité:

  

Je suis relativement nouveau dans le développement des Android, donc j’ai peut-être commis quelques erreurs évidentes.
Merci d’avance.

Vous devez append les éléments suivants à CardView :

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

J’ai réussi à obtenir l’effet d’entraînement sur la carte de visite en:

  

et pour le custom_bg que vous pouvez voir dans le code ci-dessus, vous devez définir un fichier xml pour les périphériques lollipop (dans le package drawable-v21) et pre-lollipop (dans le package pouvant être dessiné). pour custom_bg dans le package drawable-v21, le code est le suivant:

    

pour custom_bg dans le package pouvant être dessiné, le code est le suivant:

 < ?xml version="1.0" encoding="utf-8"?>             

Ainsi, sur les appareils pré-sucette, vous aurez un effet de clic solide et sur les dispositifs à sucette, vous aurez un effet d’entraînement sur la vue carte.

Ajoutez ces deux codes de ligne dans votre vue XML pour obtenir un effet d’entraînement sur votre cardView.

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

L’effet d’entraînement a été omis dans la bibliothèque de support appcompat que vous utilisez. Si vous voulez voir l’ondulation, utilisez la version Android L et testez-la sur un appareil Android L. Par le site AppCompat v7:

“Pourquoi n’y a-t-il pas d’ondulations sur pré-Lollipop? Beaucoup de ce qui permet à RippleDrawable de fonctionner correctement est le nouveau RenderThread d’Android 5.0. Pour optimiser les performances des versions précédentes d’Android, nous avons laissé RippleDrawable pour le moment.”

Consultez ce lien ici pour plus d’informations

Si l’application minSdkVersion que vous minSdkVersion est de niveau 9, vous pouvez utiliser:

 android:foreground="?selectableItemBackground" android:clickable="true" 

Au lieu de cela, à partir du niveau 11, vous utilisez:

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

De la documentation:

clickable – Définit si cette vue réagit aux événements de clic. Doit être une valeur booléenne, “true” ou “false”.

foreground – Définit le trait à dessiner sur le contenu. Cela peut être utilisé comme une superposition. Le dessin au premier plan participe au remplissage du contenu si la gravité est définie pour remplir.

S’il existe une disposition racine telle que RelativeLayout ou LinearLayout qui contient tous les composants de l’élément adaptateur dans CardView, vous devez définir l’atsortingbut d’arrière-plan dans cette présentation racine. comme:

    

Pour moi, append le foreground à CardView ne fonctionnait pas (raison inconnue: /)

Ajout de la même chose à sa mise en page enfant a fait l’affaire.

CODE:

     

Événement Ripple pour le contrôle Android Cardview :

   

Je n’étais pas satisfait de AppCompat, j’ai donc écrit mes propres ondulations CardView et Backported. Ici, il fonctionne sur Galaxy S avec Gingerbread, donc c’est certainement possible.

entrer la description de l'image ici

Pour plus de détails, vérifiez la démo .

Ajoutez ces deux fonctions de code comme un charme pour n’importe quelle vue comme Button, Linear Layout ou CardView Il suffit de mettre ces deux lignes et de voir la magie …

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

Pour ceux qui recherchaient une solution au problème de l’effet d’entraînement qui ne fonctionnait pas sur un CardView créé par programmation (ou, dans mon cas, une vue personnalisée qui étend CardView), montré dans RecyclerView, les éléments suivants fonctionnaient pour moi. En principe, déclarer les atsortingbuts XML mentionnés dans les autres réponses dans le fichier de mise en page XML ne semble pas fonctionner pour une carte CardView créée par programmation ou créée à partir d’une présentation personnalisée (même si la vue racine utilise CardView ou l’élément de fusion). ils doivent être programmés comme ceci:

 private class MadeUpCardViewHolder extends RecyclerView.ViewHolder { private MadeUpCardView cardView; public MadeUpCardViewHolder(View v){ super(v); this.cardView = (MadeUpCardView)v; // Declaring in XML Layout doesn't seem to work in RecyclerViews if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int[] attrs = new int[]{R.attr.selectableItemBackground}; TypedArray typedArray = context.obtainStyledAtsortingbutes(attrs); int selectableItemBackground = typedArray.getResourceId(0, 0); typedArray.recycle(); this.cardView.setForeground(context.getDrawable(selectableItemBackground)); this.cardView.setClickable(true); } } } 

MadeupCardView extends CardView Kudos à cette réponse pour la partie TypedArray .

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

Travailler seulement api 21 et utiliser ce pas utiliser cette vue de liste de rangée