AnimatedVectorDrawableCompat使用回调循环动画

tpl*_*ive 3 animation android android-animation animatedvectordrawable

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

我希望动画在活动期间循环播放。我可以播放动画,并且在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();
}
Run Code Online (Sandbox Code Playgroud)

根据我的阅读,使用Compat库应该使该功能适用​​于14以上的所有API级别,但是我什至不必去那儿,因为我的应用程序的其余部分都要求至少达到21。

是否有某种方法(最好是非hacky :))可以在这些API级别上保持一致地工作?是虫子吗?我错过了什么?

tec*_*law 6

据我所知,这是系统版本和兼容版本之间的细微差别。Compat似乎在其动画被标记为结束之前调用了回调。因此,对to的调用会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);
  }
};
Run Code Online (Sandbox Code Playgroud)