androidandroid-recyclerviewstatelistdrawable

Android: Permanently elevate View


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.


Solution

  • 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.