Подтвердить что ты не робот

Как установить state_selected в ripple drawable

Как указать android:state_selected внутри RippleDrawable

У меня есть xml для рисования, но цвет фона не отображается, когда я устанавливаю 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>
4b9b3361

Ответ 1

Нашел ответ, на всякий случай, если кто-то другой имеет ту же проблему

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

Ответ 2

Чтобы добавить к ответу @Sohaib:

@Alanv прав, что OP не нуждается в маске. Но если одно из ваших состояний селектора является прозрачным, и вам нужна маска, он идет здесь:

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

Сначала у меня была маска внутри моего селектора и: стрела:

Ответ 3

Объединив вышеупомянутый ответ с другими ответами:

Каким должен быть цвет Ripple, colorPrimary или colorAccent? (Дизайн материалов)

Дает хороший эффект пульсации, который также работает, когда элемент находится в выбранном состоянии.

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

Это относится к папке drawable-v21, для других платформ вы можете просто создать селектор, который использует цвет акцента:

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

Ответ 4

Я хотел подражать поведению флажков Material Design, но я не мог получить их правильно, пока не использовал ColorStateList следующим образом:

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

В цвете /checked _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>

Атрибут "? android: textColorHighlight" - это ваш цвет акцента, но с правильной прозрачностью для использования в ряби (я думаю, что это 26%).

Кроме того, вы должны предоставить резервную копию для устройств pre API 21 в 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>