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级别上保持一致地工作?是虫子吗?我错过了什么?
据我所知,这是系统版本和兼容版本之间的细微差别。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)
| 归档时间: |
|
| 查看次数: |
799 次 |
| 最近记录: |