有没有办法在Android上反向运行AnimatorSet
? ValueAnimator
API确实为各个动画师提供了反向方法,但没有为一组动画师提供反向方法。
答案 0 :(得分:4)
如果你的AnimatorSet
按顺序播放,那么你可以使用@blackbelt提到的方法:
public static AnimatorSet reverseSequentialAnimatorSet(AnimatorSet animatorSet) {
ArrayList<Animator> animators = animatorSet.getChildAnimations();
Collections.reverse(animators);
AnimatorSet reversedAnimatorSet = new AnimatorSet();
reversedAnimatorSet.playSequentially(animators);
reversedAnimatorSet.setDuration(animatorSet.getDuration());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
// getInterpolator() requires API 18
reversedAnimatorSet.setInterpolator(animatorSet.getInterpolator());
}
return reversedAnimatorSet;
}
需要注意的是,这仅适用于简单的顺序动画,因为原始AnimatorSet
中设置的任何依赖项都将丢失。此外,如果在AnimatorSet
上使用插值器,它只会继续使用API 18或更新(根据上面提到的方法,您也可以手动将插值器添加回新的反向动画集)。
AnimatorSet
中的各个动画不会反向播放,如果需要,那么您还需要迭代AnimatorSet
的动画并设置ReverseInterpolator
每个,请参阅answer至Android: Reversing an Animation。
答案 1 :(得分:1)
您可以从ValueAnimator.ofFloat(0, 1)
获取初始输入值,并在想要撤消动画时调用yourAnimator.setFloatValues(1, 0)
之前使用yourAnimatorSet.start()
切换它们
答案 2 :(得分:1)
API 26中添加了reverse()方法:
反向播放AnimatorSet。如果使用setCurrentPlayTime(long)将动画搜索到特定的播放时间,则它将从调用反向时所寻找的点向后播放。否则,它将从结束开始并向后播放。仅对当前动画设置此行为;未来播放动画将使用前进的默认行为。
注意:无限AnimatorSet不支持反向。