web-dev-qa-db-ja.com

リップルドロウアブルでstate_selectedを設定する方法

RippleDrawable 内で_Android: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>
_
55
Sohaib

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

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

@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:の中にマスクを持っていました

14
tir38

上記の回答を他の回答と組み合わせて:

Ripple、colorPrimaryまたはcolorAccentの色はどうあるべきか?(マテリアルデザイン)

アイテムが選択された状態にある場合にも機能する素敵な波紋効果を与えます。

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

Material Designチェックボックスの動作を模倣したかったのですが、ColorStateListを次のように使用するまで、正しく取得できませんでした。

Drawable-v21/bg_c​​heckbox_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_c​​heckbox_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>
1