66

RippleDrawableandroid:state_selected内の指定方法

次のリップル ドローアブルの 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

4 に答える 4

114

他の誰かが同じ問題を抱えている場合に備えて、答えを見つけました

<?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>
于 2014-12-16T03:48:11.603 に答える
17

@Sohaib の回答に追加するには:

@Alanvは、OPがマスクを必要としなかったのは正しいです。ただし、セレクターの状態の 1 つが透明で、マスクが必要な場合は、次のようになります。

<?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: 内にマスクを持っていました。

于 2016-07-22T15:58:35.660 に答える
2

マテリアル デザインのチェックボックスの動作を模倣したかったのですが、次のように 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>
于 2017-03-19T00:34:02.527 に答える