我尝试使用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级别上保持一致?这是一个错误吗?我错过了什么吗?
答案 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);
}
};