web-dev-qa-db-fra.com

Utilisation de? SelectableItemBackground avec une couleur de fond blanche

J'ai toujours utilisé Android:background="?selectableItemBackground" pour un effet d'entraînement lorsqu'un clic est effectué sur une vue (une LinearLayout par exemple). Je pense avoir lu quelque part que cela est rétro-compatible avec l'API 14.

Cependant, j'ai constaté que je devais utiliser cet effet d'entraînement, mais avec un fond blanc. Plus précisément, j'ai une mise en page pour un élément de la liste qui sera affichée sur le fond de couleur par défaut (j'étends à partir de Theme.AppCompat.Light.NoActionBar), je veux donc que l'élément de la liste se démarque de cet arrière-plan en coloriant le blanc de la liste (#FFFFFF) .

Voici la disposition des éléments de la liste:

<?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>

Ce qui précède produit un effet d'entraînement sans fond blanc.

Si j'essaye:

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

Cela produit évidemment un fond blanc mais sans effet d'entraînement.

J'ai aussi essayé autre chose - et cela a abouti à un résultat proche de ce que je cherche:

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

    ...

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

Ce qui précède m'a donné le fond blanc avec un effet d'entraînement. Cependant, l'ondulation semble toujours partir du centre, quelle que soit la partie de l'élément sur laquelle je clique.

Voici quelques captures d'écran illustrant le résultat actuel (ignorez l'ombre en haut de la liste des éléments - il s'agit de l'ombre de AppBarLayout et Toolbarque j'utilise).

 enter image description here

 enter image description here

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

31

Vous pouvez utiliser le premier plan de votre FrameLayout: 

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

Vous pouvez créer une liste de couches dans votre dossier pouvant être dessiné et la définir comme arrière-plan:

<?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>
21
Marcel50506

L'ondulation que l'on peut dessiner est une LayerDrawable. Donc, la bonne façon de 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>
0
Teovald