如果ValueAnimator是从startListener调用的,则它具有无限调用cancel()

时间:2018-06-27 12:27:31

标签: android user-interface animation listener

我有两个ValueAnimator实例在onClickListener内部启动-一个实例将view向上移动,另一个实例将相同的view向下移动。每个动画都有一个startListener,因此当一个动画开始时,第二个动画称为cancel()。也就是说,如果动画说出,在中间中断,-使动画下降,则cancel()应该可以工作,并且可以工作,但是如果我在两个动画上都设置了startOffset,{{1 cancel()中的}}工作了很多次(就像在循环中一样),然后我有了一个startListener

我注意到没有stackOverFlowError时也会出现相同的错误,但是如果我调用这两个动画,它们都将从相同的startOffset开始而不在第一个动画中调用view。但是cancel()cancel()(!)内部被调用。仅当startOffset的延迟结束后,动画才以startListener开始以本地方式播放时,startListener不起作用。

代码:

anim.start()

问题:如果在Float firstLevelUp = 200f; Float firstLevelDown = 0f; long duration = 1500l; ValueAnimator valueAnimatorView1Down = ValueAnimator.ofFloat(firstLevelUp,firstLevelDown); ValueAnimator valueAnimatorView1Up = ValueAnimator.ofFloat(firstLevelUp,firstLevelDown); public void initAnim(final View view){ valueAnimatorView1Down.setDuration(duration); valueAnimatorView1Up.setDuration(duration); valueAnimatorView1Down.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { if (valueAnimatorView1Up.isStarted()) { valueAnimatorView1Up.cancel(); valueAnimatorView1Down.setCurrentPlayTime(duration - valueAnimatorView1Up.getCurrentPlayTime()); Log.i("Down View1 animation " , "STARTED WITH CANCEL"); }else { Log.i("Down View1 animation " , "STARTED WITHOUT CANCEL"); } } @Override public void onAnimationCancel(Animator animation) { Log.i("DownView1 animation " , "CANCELED"); } }); valueAnimatorView1Up.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { if (valueAnimatorView1Down.isStarted()) { valueAnimatorView1Down.cancel(); valueAnimatorView1Up.setCurrentPlayTime(duration - valueAnimatorView1Down.getCurrentPlayTime()); Log.i("Up View1 animation " , "STARTED WITH CANCEL"); }else { Log.i("Up View1 animation " , "STARTED WITHOUT CANCEL"); } } @Override public void onAnimationCancel(Animator animation) { Log.i("Up View1 animation " , "CANCELED"); } }); valueAnimatorView1Down.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { view.setTranslationY((Float) valueAnimatorView1Down.getAnimatedValue()); } }); valueAnimatorView1Up.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { view.setTranslationY((Float) valueAnimatorView1Up.getAnimatedValue()); } }); } public void startViewAnimation(boolean side) { if (side) { Log.i("Down animations ", "start()"); valueAnimatorView1Down.setStartDelay(800); valueAnimatorView1Down.start(); } else { Log.i("Up animations ", "start()"); valueAnimatorView1Up.setStartDelay(800); valueAnimatorView1Up.start(); } } } 结束之前将动画更改为第二个动画,为什么循环调用cancel()上的onStartListenerstackOverFlowError第一个(尽管如果我在启动延迟后调用新动画-一切正常,)以及如何解决它?

0 个答案:

没有答案