Android: Permanently elevate View

2019-07-22 14:21发布

I have a RecyclerView, that has a RippleEffect as well as a StateListAnimator (which is shown below):

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>

The question is, how would one elevate the view that is using this xml when it is clicked, and then de-elevate it when the view is clicked again.

1条回答
老娘就宠你
2楼-- · 2019-07-22 15:11

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.

查看更多
登录 后发表回答