我有一个ObjectAnimator,它可以在我的应用程序中标记ProgressBar的可绘制进度。但是,我正在使用数据绑定来控制是否应该在进度条上开始动画,还是应该手动设置进度/最大值。如果动画结束,效果很好,但是如果正在进行动画,则效果不佳。为了解释为什么它不起作用,这是我的代码:
@BindingAdapter(value = {"progress", "threshold", "animate"})
public static void animateThreshold(ProgressBar progressBar, int progress, int threshold, boolean animate) {
progressBar.getProgressDrawable().mutate();
if (animate) {
final int target = progress * 100;
progressBar.setMax(threshold * 100);
ObjectAnimator progressAnimator = ObjectAnimator.ofInt(progressBar, "progress", 0, target);
progressAnimator.setDuration(2000);
progressAnimator.setInterpolator(new DecelerateInterpolator());
progressAnimator.start();
} else {
progressBar.setMax(threshold * 100);
progressBar.setProgress(progress * 100);
}
}
我正在max
块中设置progress
和else
以镜像if
块中的值,因为如果动画仍在进行中,即使我将覆盖进度和最大值,动画将继续增加并超过我设置的最大值。我目前拥有的解决方案没有遇到“溢出”问题,但是在动画继续之前,它仍然会短暂闪烁进度/最大值。通常,我将能够避免此代码块并只让动画完成,但是我在回收器视图中的项目中使用了这些进度条,并且由于它们已被回收,我需要明确设置每个进度条的进度以确保它们没有保持旧的价值。
理想情况下,我想要的是一种在可绘制属性上引用动画的方法,以便可以像在任何动画中一样在else
块中进行取消。
请注意,因为动画是附加到drawable的属性上的,而不是ProgressBar本身的,所以我不能简单地调用progressBar.getAnimation
。
有没有一种方法可以引用我创建的ObjectAnimator并将其附加到drawable属性?
谢谢