41 votes

À l'aide ?selectableItemBackground avec du blanc comme couleur d'arrière-plan

J'ai toujours été à l'aide d' android:background="?selectableItemBackground" pour un effet d'entraînement lorsqu'une vue (un LinearLayout par exemple) est cliqué. Je pense que j'ai lu quelque part que c'est rétro-compatible avec les API 14.

Cependant, j'ai trouvé que j'ai besoin d'utiliser cet effet d'entraînement, mais avec un arrière-plan blanc. Plus précisément, j'ai une mise en page pour un élément de la liste qui sera affichée sur la valeur par défaut de la couleur d'arrière-plan (je suis étendant à partir de Theme.AppCompat.Light.NoActionBar), alors je veux l'élément de la liste de se démarquer de ce qui précède, par la coloration de l'élément de la liste blanche,#FFFFFF).

Ici est la liste de page de l'élément:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="?selectableItemBackground"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    ...

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:paddingLeft="@dimen/mdu_keyline_1"
        android:paddingRight="@dimen/mdu_keyline_1"
        android:paddingTop="@dimen/mdu_padding_normal"
        android:paddingBottom="@dimen/mdu_padding_normal">

        ...

    </LinearLayout>

</FrameLayout>

Ci-dessus, produit de l'effet d'entraînement sans le fond blanc.

Si j'essaie:

<FrameLayout ...
    android:background="@color/white">

De toute évidence, cela produit un fond blanc, mais sans l'effet d'entraînement.

J'ai aussi essayé quelque chose d'autre, et cela a produit un résultat plus proche de ce que je suis à la recherche de:

<FrameLayout ...
    android:background="@color/white">

    ...

    <LinearLayout ...
        android:background="?selectableItemBackground">

Le ci-dessus m'a donné le fond blanc, avec un effet d'entraînement. Cependant, l'ondulation semble toujours commencer par le centre, peu importe de quelle partie de l'article que je cliquez.

Voici quelques captures d'écran montrant le résultat courant (ignorer l'ombre en haut de la liste des éléments - c'est l'ombre de l' AppBarLayout et Toolbar j'utilise).

enter image description here

enter image description here

Comment pourrais-je obtenir l'effet désiré?

81voto

pdegand59 Points 6690

Vous pouvez utiliser le premier plan de votre FrameLayout :

<FrameLayout ...
    android:background="@android:color/white"
    android:foreground="?attr/selectableItemBackground">

28voto

Marcel50506 Points 598

Vous pouvez créer un calque de liste dans un drawable votre dossier, et de définir à votre contexte:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/white"/>
    <item android:drawable="?attr/selectableItemBackground"/>
</layer-list>

0voto

Teovald Points 1667

Ondulation drawable est un LayerDrawable . Donc la bonne façon de le faire est :

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?attr/colorControlHighlight">

    <item>
        <shape>
            <solid
                android:color="#FFFFFF"/>
        </shape>
    </item>

    <item android:id="@android:id/mask">
        <shape>
            <solid android:color="@android:color/white"/>
        </shape>
    </item>

</ripple>

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