Search code examples
androidandroid-animationandroid-vectordrawableanimatorset

Restart AnimatorSet of AnimatedVectorDrawableCompat


This is I need Realized effect by AnimatedVectorDrawableCompat.

vector_drawable_anim.xml

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
                 android:drawable="@drawable/vector_drawable">
    <target
        android:name="star"
        android:animation="@animator/star_anim"/>
</animated-vector>

vector_drawable.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="500px"
        android:height="500px"
        android:viewportHeight="500"
        android:viewportWidth="500">
    <group
        android:name="star_group"
        android:scaleX="5.0"
        android:scaleY="5.0">
        <path
            android:name="star"
            android:pathData="M 50.0,90.0 L 82.9193546357,27.2774101308 L 12.5993502926,35.8158045183 Z"
            android:strokeColor="@color/colorAccent"
            android:strokeWidth="1"/>
    </group>
</vector>

star_anim.xml

<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:ordering="sequentially">

    <objectAnimator
        android:duration="1000"
        android:propertyName="trimPathStart"
        android:valueFrom="1"
        android:valueTo="0"/>

    <objectAnimator
        android:duration="1000"
        android:propertyName="trimPathEnd"
        android:valueFrom="1"
        android:valueTo="0"/>

</set>

But the AnimatorSet can't set repeatMode.

If I set objectAnimator's repeatMode, the second objectAnimator won't show.

What should I do?


Solution

  • What about looping it inside a thread until the ImageView is destroyed?

    Perfectly working code sample:

      ImageView animatedImageView = (ImageView) findViewById(R.id.iv);
      AnimatedVectorDrawableCompat animatedVectorDrawable = (AnimatedVectorDrawableCompat) animatedImageView.getDrawable();
    
            new Thread(new Runnable() {
                public void run() {
                    while (animatedImageView != null) {
                        try {
                            animatedImageView.post(new Runnable() {
                                @Override
                                public void run() {
                                    animatedVectorDrawable.start();
                                }
                            });
                            Thread.sleep(500);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
    

    Alternatively, you can use the registerAnimationCallback() mentioned by azizbekian followed by this git gist code sample:

    import android.app.Activity;
    import android.graphics.drawable.Animatable;
    import android.graphics.drawable.Animatable2;
    import android.graphics.drawable.AnimatedVectorDrawable;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ImageView iv = (ImageView) findViewById(R.id.pin);
            final AnimatedVectorDrawable avd = (AnimatedVectorDrawable) iv.getDrawable();
            avd.registerAnimationCallback(new Animatable2.AnimationCallback() {
                @Override
                public void onAnimationEnd(Drawable drawable) {
                    avd.start();
                }
            });
            avd.start();
        }
    }