Android选定状态覆盖了波纹效果

8

我已经寻找了一段时间,但没有找到答案...

我有一个带有项目的回收视图,当选择项目时,项目会变成红色背景和白色文本(之前是白色背景和黑色文本)。为了实现这个效果,我使用了一个选择器。

最近我尝试给它添加一个涟漪效果,但除非我长按该项,否则该项的背景会直接变成红色,没有涟漪效果。我认为这是因为选择器状态state_selected覆盖了状态state_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个回答

17

为了创建一个具有涟漪效果和显示选中状态的选择器背景,我按照以下步骤进行:

首先定义带有一些透明度的高亮颜色:

  • values/colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="selector_color">#660000ff</color>
</resources>

您可能希望在Lollipop之前保持兼容性。将传统的旧式选择器放入drawable文件夹中:

  • drawable/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-v21 文件夹中添加以下图层可绘制项:

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

2
对于其他人,在使用按钮时,这种图层列表方法是可行的,但您需要使用state_activated。 - urSus
尽管涟漪效果运行良好,但列表项未保持选定状态。 - Suleiman19
1
这个非常好用。涟漪效果的颜色和选中的颜色应该不同,这样用户在选择已经选中的项目时才能看到涟漪效果。 - hfann
1
非常好的解决方案,但正如@urSus已经提到的那样,您需要使用“state_activated”而不是“state_selected”。谢谢! - Johannes Muenichsdorfer

1

我有另一个案例需要使用选择器和图层列表

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

这个方法可行,如果你没有任何图层叠加,只需将ripple下的项目替换为你的项目形状。 希望这有所帮助。

0

如果您将RecyclerView的项视图包装在FrameLayout中,并设置FrameLayout的android:background="?selectableItemBackground"和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"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接