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?
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();
}
}
Almost what you want, and in pure XML:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<objectAnimator
android:duration="1000"
android:propertyName="trimPathStart"
android:repeatCount="infinite"
android:startOffset="1000"
android:valueFrom="1"
android:valueTo="0" />
<objectAnimator
android:duration="1000"
android:propertyName="trimPathStart"
android:repeatCount="infinite"
android:startOffset="1000"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="1" />
</set>
The difference from what you want is the direction of the path trimming back. But it looks awesome.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With