如何在Android API 19以下的版本中恢复和暂停ObjectAnimator?

10

我知道API级别19支持在ObjectAnimators上使用pause()和resume()方法。但是在我的项目中,API级别为14,我有一个应用于ImageView以旋转它的ObjectAnimator。我希望在触摸时暂停ObjectAnimator提供的动画,并从ImageView的原始位置恢复动画。

所以我尝试在我的stopAnimation()函数中保存当前播放时间并取消ObjectAnimator。

private void stopAnimation(){
        currentTime = mGlobeAnimator.getCurrentPlayTime();
        mGlobeAnimator.cancel();
    }
在startAnimation()函数中,我重新创建了动画器,将其目标设置为图像视图,设置已保存的播放时间并启动它。
private void startAnimation(Context context, View view, float startAngle) {
        ObjectAnimator globeAnimatorClone = (ObjectAnimator)AnimatorInflater.loadAnimator(context, R.animator.rotate_globe);
        globeAnimatorClone.setTarget(mImageView);
        globeAnimatorClone.setCurrentPlayTime(currentTime);
        globeAnimatorClone.start();
}

这不起作用。请问有人可以提供任何指针来暂停和恢复动画吗,适用于API 19之前的级别?

3个回答

19

我认为我通过启动动画,然后设置currentPlayTime()来使其工作。文档清楚地说明(我刚刚偶然发现)如果动画尚未启动,则使用此方法设置的currentPlayTime不会向前推进!

将动画的位置设置为指定的时间点。此时间应在0和动画的总持续时间之间,包括任何重复。如果尚未启动动画,则在设置为此时间后,它将不会向前推进;它只会将时间设置为此值,并根据该时间执行任何适当的操作。如果动画已经在运行,则setCurrentPlayTime()将将当前播放时间设置为此值,并从该点继续播放。 http://developer.android.com/reference/android/animation/ValueAnimator.html#setCurrentPlayTime(long)

private void stopAnimation(){
    mCurrentPlayTime = mRotateAntiClockwiseAnimator.getCurrentPlayTime();
    mRotateAntiClockwiseAnimator.cancel();
}

private void startAnimation() {
        mRotateAntiClockwiseAnimator.start();
        mRotateAntiClockwiseAnimator.setCurrentPlayTime(mCurrentPlayTime);
}

ts 可以与 ObjectAnimator 一起使用,但我们如何暂停/恢复 ObjectAnimatorSet? - Deven
这个无法与 repeatCount = Animation.INFINITE 一起使用。 - Konstantin Konopko

1
你所做的只是重新启动你的动画,相反你可以创建一个自定义类来实现带有暂停和恢复方法的动画。首先需要检查设备是否为19 API及以上版本,如果是,则使用对象动画的本地暂停和恢复功能;否则使用从API 1设计的常规动画。你可以参考thread来了解如何在API 19以下暂停和恢复动画。

自定义可暂停动画适用于视图动画,并且运行良好。但是我还有一个帧布局,其中放置了某些图像按钮。我需要旋转此帧布局,以便图像按钮随其移动。如果我使用自定义视图动画,则图像按钮的单击事件仍然位于它们的原始位置(这就是选择 ObjectAnimators 的原因)。在这种情况下如何暂停和恢复 ObjectAnimators? - elizabetht

0

可能已经太晚了,但我刚遇到这个问题,用了你的方法解决了。 我只是在你的方法上添加了两个东西: 1. 在动画开始时检查 **mCurrentPlayTime** 是否大于零。如果它大于零,则设置 setCurrentPlayTime。否则没有意义。 2. 当动画结束时,将其重新设置为零。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接