nhaarman
nhaarman

Reputation: 100448

How to use StateListAnimator?

From the docs:

The new StateListAnimator class lets you define animators that run when the state of a view changes. The following example shows how to define an StateListAnimator as an XML resource:

<!-- animate the translationZ property of a view when pressed --> <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  <item android:state_pressed="true">
    <set>
      <objectAnimator android:propertyName="translationZ"
        android:duration="100"
        android:valueTo="2"
        android:valueType="floatType"/>
        <!-- you could have other objectAnimator elements
             here for "x" and "y", or other properties -->
    </set>   
  </item>   
  <item android:state_enabled="true"
    android:state_pressed="false"
    android:state_focused="true">
    <set>
      <objectAnimator android:propertyName="translationZ"
        android:duration="100"
        android:valueTo="2"
        android:valueType="floatType"/>
    </set> 
  </item> 
</selector>

However, it says nothing about how to actually use this xml file. There seems to be no method on the Resources class to get a StateListAnimator, and the StateListAnimator class does not provide any info either.

How can we use this?

Upvotes: 27

Views: 32121

Answers (3)

Abhishek Bhadani
Abhishek Bhadani

Reputation: 1

Lets you define a number of Animators that will run on the attached View depending on the View's drawable state.

It can be defined in an XML file with the element. Each State Animator is defined in a nested element.

The new StateListAnimator class lets you define animators that run when the state of a view changes. The following example shows how to define an StateListAnimator as an XML resource: https://indiacodinghub.blogspot.com/2021/01/how-to-use-statelistanimator.html

Upvotes: -1

Radesh
Radesh

Reputation: 13575

I use this code in java and works fine

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            crd.setStateListAnimator(AnimatorInflater.loadStateListAnimator(ctx,
                    R.drawable.card_smooth_shadow));
}

And my animator/card_smooth_shadow.xml

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

RESULT

result

Upvotes: 16

harism
harism

Reputation: 6073

In Android L a new xml attribute has been added for View :

android:stateListAnimator   : Sets the state-based animator for the View.

Additionally for instantiating StateListAnimator object programmatically a new method :

loadStateListAnimator(Context context, int id)

has been added to AnimatorInflater .

These can be found on Android L developer preview documentation package.

Upvotes: 27

Related Questions