Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用回调的AnimatedVectorDrawableCompat循环动画_Android_Animation_Android Animation_Animatedvectordrawable - Fatal编程技术网

Android 使用回调的AnimatedVectorDrawableCompat循环动画

Android 使用回调的AnimatedVectorDrawableCompat循环动画,android,animation,android-animation,animatedvectordrawable,Android,Animation,Android Animation,Animatedvectordrawable,我正在尝试使用AnimatedVectorDrawableCompat在我的Android应用程序中实现一个动画,以兼容API>=21 我希望动画在活动期间循环。我能够播放动画,并且它在API>=25上也可以很好地循环。但是,当我使用API21到24在设备或模拟器上运行它时,我只看到一次动画。如果在回调方法中设置断点,我会看到它也执行回调,但动画不会重复 我发现动画运行在不同的线程上,因为它不会阻塞UI 方法如下: @Override protected void onCreate(Bundle

我正在尝试使用AnimatedVectorDrawableCompat在我的Android应用程序中实现一个动画,以兼容API>=21

我希望动画在活动期间循环。我能够播放动画,并且它在API>=25上也可以很好地循环。但是,当我使用API21到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级


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

据我所知,这是系统和兼容版本之间的细微差别。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);
  }
};
一句话也没有?风滚草