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()
。