web-dev-qa-db-fra.com

Android CardView avec une couleur d'ombre personnalisée

Est-il possible de changer la couleur de l'ombre autour de CardView? Principalement utilisé pour marquer sélectionné la carte comme elle était allumée ?

Devrait être valide sur les appareils L et pré-L.

17
Davideas

CardView Les couleurs des ombres sont définies dans les ressources de la bibliothèque CardView. Vous pouvez les remplacer en redéfinissant la valeur de la ressource dans votre propre projet, mais vous ne pouvez pas les modifier de manière dynamique par code.

Modifier: le remplacement de la valeur de la ressource ne concerne que les périphériques antérieurs à Lollipop. Sur Lollipop et au-dessus, CardView utilise toujours l'implémentation d'ombre native dont la couleur ne peut pas être modifiée.

8
BladeCoder

Mise à jour: Vérifiez ma modification .


Voici une solution de contournement:

Copiez le code source de CardView. Créez ensuite votre propre module de bibliothèque Android et utilisez-le à la place de la bibliothèque de support. Après cela, commentez ou supprimez le code dans CardView comme ci-dessous:

static {
//        if (Build.VERSION.SDK_INT >= 21) {
//            IMPL = new CardViewApi21Impl();
//        } else
            if (Build.VERSION.SDK_INT >= 17) {
            IMPL = new CardViewApi17Impl();
        } else {
            IMPL = new CardViewBaseImpl();
        }
        IMPL.initStatic();
    }

C'est-à-dire que vous utiliserez la version CardViewApi17Impl de compat-version même lorsque l'API est de 21 ou plus. Ensuite, vous pouvez définir vos propres cardview_shadow_start_color et cardview_shadow_end_color pour remplacer ceux de la classe RoundRectDrawableWithShadow. En outre, vous pouvez rendre cela plus personnalisable.

L'espoir peut aider quelqu'un.

2
Lym Zoy

J'ai utilisé un petit truc. Un CardView est mis derrière un autre. Les deux sont identiques, la différence est card_view:cardElevation="10dp" pour le premier plan et card_view:cardElevation="2dp" pour le premier. La soustraction d'élévation indique la longueur de votre ombre et la couleur du second CardView sera la couleur de l'ombre pour le premier. 

Exemple:

<Android.support.v7.widget.CardView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:card_view="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/view_click_basement"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginBottom="2dp"
    card_view:cardCornerRadius="5dp"
    card_view:cardBackgroundColor="@color/colorNewGreen"
    card_view:cardElevation="10dp"
    card_view:cardUseCompatPadding="true">

    <Android.support.v7.widget.CardView
        Android:id="@+id/view_click"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_marginBottom="2dp"
        card_view:cardCornerRadius="5dp"
        card_view:cardElevation="2dp"
        card_view:cardUseCompatPadding="true">