AnimatedVectorDrawableCompat使用回调循环动画

时间:2018-01-17 09:34:39

标签: android animation android-animation animatedvectordrawable

我尝试使用AnimatedVectorDrawableCompat在我的Android应用中实现动画,以实现API> = 21的兼容性。

我希望动画在Activity的持续时间内循环。我能够播放动画,并且它也会在API> = 25上循环播放。但是当我在使用API​​ 21到24的设备或模拟器上运行它时,我只看到动画一次。如果我在回调方法中设置断点,我会看到它也执行回调,但动画不会重复。

我发现动画在不同的线程上运行,因为它不会阻止UI。

这是方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    imageView = findViewById(R.id.image_view1);
    final AnimatedVectorDrawableCompat anim = AnimatedVectorDrawableCompat.create(this, R.drawable.avd_pass_inside);

    imageView.setImageDrawable(anim);

    anim.registerAnimationCallback(new Animatable2Compat.AnimationCallback() {
        @Override
        public void onAnimationEnd(Drawable drawable) {

            anim.start();
        }
    });
    anim.start();
}

从我读到的内容来看,使用Compat库可以使这个适用于14级及以上的所有API级别,但我甚至不必去那里,因为我的应用程序的其余部分都有要求最小的21。

是否有一些(最好是非hacky :))方法在这些API级别上保持一致?这是一个错误吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:5)

据我所知,这是系统和系统之间的细微差别。 compat版本。 Compat似乎在其动画被标记为已结束之前调用回调。因此,对start()的调用被忽略,因为它认为它还没有结束。

解决方案通常是黑客攻击:在动画完成后发布Runnable来启动它。

new Animatable2Compat.AnimationCallback() {
  @NonNull
  private final Handler fHandler = new Handler(Looper.getMainLooper());

  @Override
  public void onAnimationEnd(@NonNull Drawable drawable) {
    Animatable2Compat avd = (Animatable2Compat) drawable;
    fHandler.post(avd::start);
  }
};