web-dev-qa-db-fra.com

Comment définir state_selected dans Ripple Drawable

Comment spécifier Android:state_selected Dans un RippleDrawable

J'ai le XML suivant pour l'ondulation, mais la couleur d'arrière-plan n'apparaît pas lorsque je définis myView.setSelected(true);

<?xml version="1.0" encoding="utf-8"?>
<ripple
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:color="#DDDDDD"
    >

    <item Android:id="@Android:id/mask">
        <shape>
            <solid
                Android:color="@color/black" />
        </shape>
    </item>


    <item Android:state_selected="true">
        <shape>
            <solid
                Android:color="#EEEEEE" />
        </shape>
    </item>


    <item>
        <color Android:color="#FFFFFF" />
    </item>

</ripple>
55
Sohaib

J'ai trouvé la réponse, juste au cas où quelqu'un d'autre aurait le même problème

<?xml version="1.0" encoding="utf-8"?>
<ripple
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:color="#DDDDDD"
    >


    <item>
        <selector>
            <item Android:state_selected="true">
                <color Android:color="#EEEEEE" />
            </item>

            <item Android:state_activated="true">
                <color Android:color="#EEEEEE" />
            </item>

            <item>
                <color Android:color="#FFFFFF" />
            </item>
        </selector>
    </item>


</ripple>
92
Sohaib

Pour ajouter à la réponse de @Sohaib:

@Alanv a raison de dire que l'OP n'avait pas besoin d'un masque. Mais si l'un de vos états de sélecteur est transparent et que vous avez besoin d'un masque, il va ici:

<?xml version="1.0" encoding="utf-8"?>
<ripple
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:color="@color/ripple_color">

    <!-- mask here... -->
    <item Android:id="@Android:id/mask">
        <color Android:color="@color/black"/> <!-- any color will do -->
    </item>

    <item>
        <selector>
            <!-- ... NOT here. -->
            <item Android:state_selected="true">
                <color Android:color="@color/blue"/>
            </item>

            <item Android:state_activated="true">
                <color Android:color="@color/red"/>
            </item>

            <item>
                <color Android:color="@color/transparent"/>
            </item>
        </selector>
    </item>
</ripple>

Au départ, j'avais le masque dans mon sélecteur et: boom:

14
tir38

Combiner la réponse ci-dessus avec d'autres réponses de:

Quelle devrait être la couleur de l'ondulation, colorPrimary ou colorAccent? (Material Design)

Donne un bel effet d'entraînement qui fonctionne également lorsque l'élément est dans un état sélectionné.

<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:color="?attr/colorControlHighlight">
<!-- Ripple mask - applied to all selector states -->
<item Android:id="@Android:id/mask">
    <color Android:color="#42ffffff" />
</item>
<!-- Selected state of item -->
<item>
    <selector>
        <item Android:state_selected="true">
            <color Android:color="?attr/colorAccent" />
        </item>
    </selector>
</item>
</ripple>

Cela va dans votre dossier drawable-v21, pour d'autres plates-formes, vous pouvez simplement créer un sélecteur qui utilise la couleur d'accentuation:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@color/accent" Android:state_selected="true"/>
    <item Android:drawable="@color/accent" Android:state_pressed="true"/>
</selector>
7
Meanman

Je voulais imiter le comportement des cases à cocher Material Design mais je ne pouvais pas les faire correctement jusqu'à ce que j'utilise un ColorStateList comme celui-ci:

Dans drawable-v21/bg_checkbox_ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:color="@color/checked_accent_statelist"
    Android:radius="24dp">
</ripple>

En couleur/vérifié_accent_statelist.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:color="?colorControlHighlight" Android:state_checked="false"/>
    <item Android:color="?android:textColorHighlight" Android:state_checked="true"/>
</selector>

L'attribut "? Android: textColorHighlight" est votre couleur d'accent mais avec la bonne transparence pour l'utiliser en ondulations (je pense que c'est 26%).

En outre, vous devez fournir une solution de secours pour les périphériques pré-API 21 dans drawable/bg_checkbox_ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<selector
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:exitFadeDuration="@Android:integer/config_shortAnimTime">
    <item>
        <shape Android:innerRadius="24dp" Android:shape="oval">
            <solid Android:color="@color/checked_accent_statelist"/>
        </shape>
    </item>
</selector>
1
Santiago Podestá