Эффект ряби Android, переопределенный выбранным состоянием

Поработав некоторое время, я не смог найти ответ на этот вопрос...

У меня есть вид рециркулятора с элементами, которые при выборе имеют красный фон и белый текст (предварительно фон белый, а текст черный). Для этого я использую селектор.

Недавно я попытался добавить к этому эффект ряби, но если я долго не щелкну по предмету, фон этого предмета станет ровным красным без ряби. Я предполагаю, что это потому, что состояние селектора state_selected переопределяет пульсации на sate_pressed?

Кто-нибудь знает, есть ли способ обойти это? Вот код селектора, который я использую:

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

    <item>
        <selector xmlns:android="http://schemas.android.com/apk/res/android" >
            <item
                android:drawable="@drawable/ripple"
                android:state_pressed="true"/>
            <item
                android:drawable="@android:color/holo_red_dark"
                android:state_selected="true"/>
            <item android:drawable="@android:color/white"/>
        </selector>
    </item>

</ripple>

Заранее спасибо!

3 ответа

Чтобы создать фон селектора, который имеет волновой эффект и показывает выбранный статус, я делаю следующее:

Начните с определения цвета подсветки с некоторой прозрачностью:

  • Значения /colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="selector_color">#660000ff</color>
</resources>

Вы, вероятно, хотите иметь совместимость перед леденцом на палочке. Поместите типичный селектор старой школы в папку для рисования:

  • рисуем /selector_background.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/selector_color" android:state_pressed="true"/>
    <item android:drawable="@color/selector_color" android:state_selected="true"/>
    <item android:drawable="@android:color/transparent"/>
</selector>

А затем добавьте следующий слой drawable внутри папки drawable-v21:

  • вытяжка-V21/selector_background.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <selector>
            <item android:state_selected="true"
                android:drawable="@color/selector_color" />
            <item android:drawable="@android:color/transparent" />
        </selector>
    </item>
    <item>
        <ripple android:color="@color/selector_color">
            <item android:id="@android:id/mask">
                <color android:color="@android:color/white" />
            </item>
        </ripple>
    </item>
</layer-list>

Теперь вы можете использовать @drawable/selector_background для вашего селектора.

Так что у меня есть еще один случай, в котором мне пришлось использовать селектор, а также список слоев для этого

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true">
        <ripple xmlns:android="http://schemas.android.com/apk/res/android"
                android:color="@color/colorRipple">
            <item>
                <layer-list>
                    <item>
                        <shape android:shape="rectangle">
                            <solid android:color="@color/grey_very_light" />
                        </shape>
                    </item>
                    <!-- ripple color -->
                    <item android:bottom="1dp">
                        <shape android:shape="rectangle">
                            <solid android:color="@color/c_unread_notifications_item" />
                        </shape>
                    </item>

                </layer-list>
            </item>
        </ripple>

    </item>
    <item>
        <ripple xmlns:android="http://schemas.android.com/apk/res/android"
                android:color="@color/colorRipple">
            <item>
                <!-- ripple color -->
                <layer-list>

                    <item>
                        <shape android:shape="rectangle">
                            <solid android:color="@color/grey_very_light" />
                        </shape>
                    </item>

                    <item android:bottom="1dp">
                        <shape android:shape="rectangle">
                            <solid android:color="@color/white" />
                        </shape>
                    </item>

                </layer-list>
            </item>
        </ripple>
    </item>
</selector>

Это сработало, для вашей потребности, что вы можете сделать, просто замените элемент в рябь на форму вашего элемента, если у вас нет слоев. Надеюсь это поможет

Будет лучше, если вы обернете свой вид элемента реселлера в FrameLayout и установите для android:background="? SelectableItemBackground" FrameLayout и дочерний макет FrameLayout background = "@ drawable / background"

background.xml

<item android:drawable="@color/red" android:state_selected="true"/>
<item android:drawable="@color/red" android:state_focused="true"/>
<item android:drawable="@color/red" android:state_pressed="true"/>
<item android:drawable="@color/white"/>

И тогда дочерний макет должен иметь атрибут android:duplicateParentState="true"

Другие вопросы по тегам