【问题标题】:AnimatedVectorDrawableCompat looping animation using callbackAnimatedVectorDrawableCompat 使用回调的循环动画
【发布时间】:2018-01-17 09:34:38
【问题描述】:

我正在尝试使用 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 级别上保持一致?它是一个错误吗?我错过了什么吗?

【问题讨论】:

  • 没有一条评论? 风滚草

标签: android animation android-animation animatedvectordrawable


【解决方案1】:

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

解决方案是通常的 hack:发布 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);
  }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多