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.
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 againsetSelected(false)
.The selected state then can be handled by the StateListAnimator. You may add a new item to catch
state_selected="true"
: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 of0dp
.