8

在寻找了一段时间后,我一直无法找到这个问题的答案......

我有一个回收站视图,其中的项目在选择时具有红色背景和白色文本(事先背景为白色,文本为黑色)。为此,我使用了一个选择器。

我最近尝试为此添加涟漪效果,但除非我长时间单击该项目,否则该项目的背景会直接变为红色而没有涟漪。我假设这是因为选择器状态 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>

提前致谢!

4

3 回答 3

17

要创建具有涟漪效果并显示选定状态的选择器背景,我执行以下操作:

首先定义您的突出显示颜色,并具有一些透明度:

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

您可能希望在棒棒糖之前具有兼容性。在 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你的选择器了。

于 2015-07-10T08:02:49.243 回答
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>

这很有效,如果您没有任何分层,您可以根据需要将波纹下的项目替换为您的项目形状。希望这可以帮助

于 2017-06-16T07:21:27.873 回答
0

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

于 2015-07-16T10:47:45.890 回答