我在我的应用程序中为ImageView应用了无限动画,以指示正在运行的后台线程。当线程完成时,我可以使用clearAnimation()停止动画,但它会将ImageView强制回到其起始位置,而我希望当前的动画周期能够完成(该动画周期旨在优雅地结束并回到起始位置)。有没有办法做到这一点?
我在我的应用程序中为ImageView应用了无限动画,以指示正在运行的后台线程。当线程完成时,我可以使用clearAnimation()停止动画,但它会将ImageView强制回到其起始位置,而我希望当前的动画周期能够完成(该动画周期旨在优雅地结束并回到起始位置)。有没有办法做到这一点?
注册一个AnimationListener
,并等待直到onAnimationRepeat()
来清除它。我没有尝试过这个方法,但我认为它会起作用。
只需调用setRepeatCount(0)
,然后监听onAnimationEnd
。有关更多详细信息,请参见此处。
您可以在动画监听器的onAnimationEnd()方法中设置所需的动画位置。然后,视图将显示在您在那里设置的坐标处,而不是返回到初始位置。
animation = new TranslateAnimation(0, -length, 0, 0); //setup here your translation parameters
animation.setInterpolator(new LinearInterpolator());
animation.setDuration(10);
animation.setAnimationListener(new Animation.AnimationListener() {
public void onAnimationStart(Animation animation) {
animationRunning = true;
}
public void onAnimationRepeat(Animation animation) {
}
public void onAnimationEnd(Animation animation) {
animationRunning = false;
// setAnimationPositionAfterPositionChange();
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) runningText.getLayoutParams();
params.leftMargin = currentPosition; //Calculate you current position here
runningText.setLayoutParams(params);
}
});
runningText.setAnimation(animation);
如果你正在使用animate(),你可以使用setListener(null)来停止动画,这对我很有效。
image.animate()
.translationXBy(-width* 0.5f)
.setDuration(300)
.setStartDelay(6000)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
image.animate().rotationBy(90).setDuration(1000).setStartDelay(1).setListener(null);
}
});
onAnimationEnd()
上重新启动动画来自己制作“无限”效果。不确定它是否会像无限变化那样平滑。如果这样做有效,你只需在想要消失的动画结束时不启动下一个动画即可。 - CommonsWare