Эффект ряби 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"