1

RecyclerViewRippleEffect と StateListAnimator (以下に示す) を持つ があります。

anim_lift.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_enabled="true"
        android:state_pressed="true">
        <set>
            <objectAnimator
                android:duration="@android:integer/config_shortAnimTime"
                android:propertyName="translationZ"
                android:valueTo="8dp"
                android:valueType="floatType"/>
        </set>
    </item>
    <item>
        <set>
            <objectAnimator
                android:duration="@android:integer/config_shortAnimTime"
                android:propertyName="translationZ"
                android:valueTo="0"
                android:valueType="floatType"/>
        </set>
    </item>
</selector>

問題は、この xml を使用しているビューがクリックされたときに昇格し、ビューが再度クリックされたときに昇格を解除する方法です。

4

1 に答える 1

2

This can be achieved by using the selected state of the View. If you click the View you setSelected(true) and when you click it again setSelected(false).

yourView.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        v.setSelected(!v.isSelected()); // toggle selected state
    }
});

The selected state then can be handled by the StateListAnimator. You may add a new item to catch state_selected="true":

<item android:state_selected="true">
    <set>
        <objectAnimator
            android:duration="@android:integer/config_shortAnimTime"
            android:propertyName="translationZ"
            android:valueTo="8dp"
            android:valueType="floatType"/>
    </set>
</item>

Now if the View is selected it will have an elevation of 8dp. If it's not selected the StateListAnimator will fall through to the default elevation of 0dp.

于 2016-01-14T21:13:07.560 に答える