有没有一种简单的方法来重复Android AnimatorSet
(无限)?我可以设置AnimationListener
并再次致电AnimatorSet
重启start()
吗?
我的AnimatorSet
包含两个按顺序播放的动画。
因此,如果我将两个单一动画的重复模式设置为重复,那么第二个动画的重复模式将在第二个运行时重复,对吗?
答案 0 :(得分:26)
设置它的子对象动画师的重复模式和计数;
objectAnimator.setRepeatCount(ObjectAnimator.INFINITE);
objectAnimator.setRepeatMode(ObjectAnimator.RESTART/REVERSE...);
然而,由于还有另一个错误,这将无法停止或取消。
很明显,我并不喜欢你可以在Android中制作动画的各种方式,并且让它们以某种方式让你失败。希望这有助于其他人。答案 1 :(得分:17)
前两个问题有答案
有没有一种简单的方法来重复Android AnimatorSet(无限)?我可以通过再次调用start()来设置AnimationListener并重新启动animatorSet吗?
是的,有:
mAnimationSet.addListener(new AnimatorListenerAdapter() {
private boolean mCanceled;
@Override
public void onAnimationStart(Animator animation) {
mCanceled = false;
}
@Override
public void onAnimationCancel(Animator animation) {
mCanceled = true;
}
@Override
public void onAnimationEnd(Animator animation) {
if (!mCanceled) {
animation.start();
}
}
});
mAnimationSet.start();
第三个问题的答案是否定的。将重复第一个动画,并且在所有重复之后将启动后续动画。
答案 2 :(得分:1)
不,您不能重复AnimatorSet,只能重复单个ObjectAnimator / ValueAnimator
但是您可以使用PropertyValuesHolder,以便可以从一组PropertyValuesHolder中创建一个ObjectAnimator
这里是例子
val translateY = PropertyValuesHolder.ofFloat(View.TRANSLATION_Y, -100f, 100f)
val alpha = PropertyValuesHolder.ofFloat(View.ALPHA, 0.3f, 0.7f)
val scaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 0.8f, 1.2f)
val scaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 0.8f, 1.2f)
// and more
ObjectAnimator.ofPropertyValuesHolder(myView, translateY, alpha, scaleX, scaleY).apply {
interpolator = AccelerateDecelerateInterpolator()
// duration of each animation
duration = 500L
// repeat infinite count (you can put n times)
repeatCount = ValueAnimator.INFINITE
// reverse animation after finish
repeatMode = ValueAnimator.REVERSE
// start animation
start()
}
答案 3 :(得分:1)
设置无限重复计数并为所有子动画重新启动/反向重复模式
animatorSet.childAnimations.forEach {
val animator = it as ObjectAnimator
animator.repeatCount = ObjectAnimator.INFINITE
animator.repeatMode = ObjectAnimator.RESTART / REVERSE
}
答案 4 :(得分:0)
在我的脑海中 - 动画框架是痛苦的源泉,特别是如果你想支持2.x.我经常遇到试图用AnimationListener
种“玩家”做任何更复杂的跟踪的集合的问题。我跟踪我播放的动画(如int
等)然后在onAnimationEnd
上我开始另一个应该按顺序播放的动画。这样我就可以轻松地“编写”我的序列,并且不会打扰破坏的框架。
答案 5 :(得分:-2)
因此,上述选项都不合适。
如果您使用:
@Override
public void onAnimationEnd(Animator animation) {
if (!mCanceled) {
animation.start();
}
}
有时你最终会得到stackOverFlow异常。
最好的事情是做一些事情:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (true && getActivity() != null) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
set3.start();
}
});
SystemClock.sleep(1200);
}
}
});
t.start();
答案 6 :(得分:-3)
这个怎么样?
@Override
public void onAnimationEnd(Animator animation) {
if (!mCanceled) {
animation.reset(); //<- added.
animation.start();
}
}