如何在使用动画程序对视图的某些属性进行动画处理后将其重置为原始状态?

46

我正在使用动画器 (ObjectAnimator)来对视图的一些属性(缩放、旋转)进行动画效果。

当将ObjectAnimator设置到目标视图时,目标视图可以正常地进行动画。

但是现在有一个额外的要求,即在一段时间后将视图恢复到原始位置(重置)

我试图使用cancel()取消动画,但这只会取消动画而不会重置视图。

可能的解决方案:创建另一个动画器,该动画器只执行初始动画器的相反操作。

还有其他重置视图的方法吗?


需要在同一动画中重置吗?比如淡入淡出? - pskink
我已经对其设置了持续时间。一旦完成,我想将其重置为其原始未动画状态,就像动画之前那样。当我们具有fillEnabled = false的视图动画发生时,我需要相同的实现。 - Napolean
1
尝试使用自定义插值器,例如CycleInterpolator。 - pskink
@pskink CycleInterpolator在我这种情况下会起作用,但需要对周期和持续时间进行一些调整。谢谢。 - Napolean
这就是为什么我建议使用自定义插值器的原因... - pskink
你能提供一份代码示例吗?除了将动画重复指定次数之外,使用CycleInterpolator会产生什么效果? - Alon
5个回答

1
ObjectAnimator.cancel()ObjectAnimator.end()方法并不会取消动画对被动画对象的效果,而只是在调用这些方法时取消它们的执行(有关更多详细信息,请参见ValueAnimator文档)。
现在,我可以考虑三种主要方法来实现您想要的效果:
  1. ObjectAnimator上设置一个监听器,并在调用OnAnimationEnd/OnAnimationCancel时,手动重置视图的属性。
  2. 如果您要重置的视图属性是在XML文件中给出的,则可以重新加载它。有关更多详细信息,请查看此答案
  3. 使用ObjectAnimator.reverse()方法来反转动画的执行,从而重置视图的属性。最好在动画结束时调用反转开始,因此您可能需要在动画上放置一个监听器,并检查调用带有要反转的动画的OnAnimationEnd时机。

1
我遇到了同样的问题,因为我使用了ViewPropertyAnimator对视图进行动画处理,并且一遍又一遍地使用addView()removeView(),以便不创建新视图,但是一个视图只能显示一次。当你移除视图时,再次调用addView(),它不会显示,但你可以看到属性可见性是可见的,animationListener也被调用了。这很奇怪。

1

1

我曾经遇到过与我的视图相关的同样问题。所以我用了一个技巧来解决这个问题。我们假设有一个视图,在点击后应用动画。


          viewLayout.arrow_back.setOnClickListener {arrow ->
            arrow.animate().rotationXBy(50F) // this is a just simple anim not so usefull
                .start()
            arrow.isEnabled = false
        }

我希望它能帮助到某人。


0
你的意思是停止正在运行的动画吗? 如果是这样,请调用clearAnimation()从您调用startAnimation();的视图中删除动画 如果您的意思是在动画结束后将视图重置为其原始外观,则始终将setFillAfter(false);设置为动画。

5
我意思是将视图重置为应用动画之前的未动画位置。clearAnimation() 不起作用。而且这是 PropertyAnimation 而不是普通的视图动画。 - Napolean
1
这是重置动画的正确解决方案。setFillAfter(false); 完美地解决了问题。 - Megaetron

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