androidanimation没有在onAnimationEnd中完成

虽然animation.hasEnded被设置为true,但是当onAnimationEnd事件被触发时,似乎Androidanimation并没有真正完成。

我希望我的视图在它的ScaleAnimation的末尾可以修改它的背景,但是你可以清楚地看到它在它完成之前改变了几个毫秒。 问题是,它闪烁,因为新的背景出现(=是)缩短了一段时间,直到animation真的完成。

有没有办法让animation的真实结束,或只是防止新的背景在这么短的时间内缩放呢?

谢谢!


//编辑:我正在使用一个AnimationListener来获得以下调用:

  @Override public void onAnimationEnd(Animation animation) { View view = (MyView) ((ExtendedScaleAnimation) animation).getView(); view.clearAnimation(); view.requestLayout(); view.refreshBackground(); // <-- this is where the background gets changed } 

这是与这个问题相关的实际错误http://code.google.com/p/android-misc-widgets/issues/detail?id=8

这基本上表明,当一个AnimationListener被附加到一个animation时,onAnimationEnd方法并不能真正的工作

解决方法是侦听要将animation应用到的视图中的animation事件。例如,如果最初将animation侦听器附加到animation,如下所示

 mAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationEnd(Animation arg0) { //Functionality here } }); 

然后将animation应用到这样的ImageView

 mImageView.startAnimation(mAnimation); 

要解决此问题,您现在必须创build一个自定义ImageView

 public class MyImageView extends ImageView { 

然后重写View类的onAnimationEnd方法并提供所有的function

 @Override protected void onAnimationEnd() { super.onAnimationEnd(); //Functionality here } 

这是针对此问题的适当解决方法,在over-riden View – > onAnimationEnd方法中提供function,而不是连接到Animation的AnimationListener的onAnimationEnd方法。

这工作正常,并不再有任何闪烁的animation结束。 希望这可以帮助。

我是abe通过调用clearAnimation()onAnimationEnd内部的animation,这取消了闪烁它解决这个奇怪的为什么有人必须这样做,因为onAnimationEndcallback只应该已经被调用,如果animation已经结束。 但是我猜想,答案就在于如何在view / layout中处理animationcallback。 现在把它作为一个无破解的解决scheme,这是正常的。

  animation.setAnimationListener(new AnimationListener() { public void onAnimationEnd(Animation anim) { innerView.clearAnimation(); // to get rid of flicker at end of animation RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams (innerBlockContainer.getWidth(), innerBlockContainer.getHeight()); /* Update lp margin, left/top to update layout after end of Translation */ ViewGroup parent_ofInnerView = (ViewGroup)innerView.getParent(); vp.updateViewLayout(innerBlockContainer, lp); } public void onAnimationRepeat(Animation arg0) {} public void onAnimationStart(Animation arg0) { } }); innerView.startAnimation(animation); 

我有一个类似的问题,我用自定义视图类Soham的解决scheme。

它运行良好,但最后,我find了一个更简单的解决scheme,为我工作。

在调用view.StartAnimation(animation) ,在我的程序中的下一步之前,我添加了一个短暂的延迟,足以让animation完成,但足够短以致不会被用户注意到:

 new Handler().postDelayed(new Runnable() { @Override public void run() { nextStepInMyProgram(); } }, 200);// delay in milliseconds (200) 

我有同样的问题,并解决了使用

 view.clearAnimation(); 

之前

 view.startAnimation(anim); 

出于某种原因onAnimationStart工作正常,并onAnimationEnd不。 所以inheritance人如何我原来做了什么,我改变了什么:

尝试1(闪烁):a)将图像从0px移动到80px b)在onAnimationEnd中,将图像的位置设置为80px

尝试2(无闪烁):a)在onAnimationStart中,将图像的位置设置为80px b)将图像从-80px移动到0px

希望这是有道理的。 基本上我翻转了我做的方式

尝试从你的对象中使用getAnimation():

 public void onShowListBtnClick(View view) { rightPanel.startAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.slide_left)); rightPanel.getAnimation().setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { // write your code here } }); } 

这对我工作:

 @Override public void onAnimationUpdate(ValueAnimator animation) { if (Float.compare(animation.getAnimatedFraction(),1.0f)) { // animation ended; //do stuff post animation } } 

一个简单的解决方法是添加一行到AnimationListener.onAnimationEnd()

 @Override public void onAnimationEnd(Animation a) { a.setAnimationListener(null); … } 

在屏幕上旋转也可以停止注册。 在这种情况下onAnimationEnd()不被调用。 我的解决方法:

  animation.setDuration(animationDuration); animation.setAnimationListener(new AnimationListenerAdapter() {...}); view.startAnimation(animation); handler.postDelayed(new Runnable() { @Override public void run() { if(!animation.hasEnded()) { // here you can handle this case } } }, animationDuration + 100); 

我有这个问题,因为我的Animation没有在主线程中启动。 这导致duration为0.然而, Animation确实发挥了作用 – 刚刚在执行后立即调用onAnimationEnd()