Как установить состояние, выбранное в Ripple drawable
Как указать android:state_selected
внутри RippleDrawable
у меня есть следующий xml для Ripple drawable, но цвет фона не отображается, когда я устанавливаю 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>
4 ответов
нашел ответ, на всякий случай, если у кого-то еще есть такая же проблема
<?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>
чтобы добавить к ответу @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>
У меня изначально была маска внутри селектора и: boom:
объединение вышеуказанного ответа с другими ответами от:
каким должен быть цвет пульсации, 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>
Я хотел имитировать поведение флажков 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>