如何在涟漪可绘制中设置state_selected

66

如何在RippleDrawable中指定android:state_selected

我有以下Ripple Drawable的xml代码,但是当我设置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个回答

117

找到了答案,以防其他人遇到同样的问题

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

1
在这里,您不需要设置一个遮罩层,因为您的遮罩和内容具有相同的边界和透明度。移除遮罩将显著提高性能。 - alanv
1
感谢 @alanv。已删除蒙版。您提到了相同的边界和不透明度,蒙版中的不透明度是如何工作的? - Sohaib
7
如果您在选择器的正常状态下使用透明颜色,则需要使用蒙版,否则涟漪将无法绘制。 - vovahost
@vovahost 你说的透明颜色问题是正确的,但即使使用蒙版,涟漪仍然会出现,但颜色不是100%不透明的,它有一些透明度。你有任何处理这个问题的想法吗? - andrei

17

补充@Sohaib的回答:

@Alanv说得没错,问题提出者不需要遮罩。但如果你的选择器状态之一是透明的,并且你需要一个遮罩,那么就放在这里:

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


10
将上述答案与以下回答结合起来: 应该使用哪种颜色的涟漪效果,colorPrimary还是colorAccent?(Material Design) 提供了一个漂亮的涟漪效果,也适用于项处于选定状态时。
<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>

3

我希望能够模仿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>

在 color/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%)。

此外,在drawable/bg_checkbox_ripple.xml中应该为API 21之前的设备提供备选方案。

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

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