onAnimationEnd没有被调用,onAnimationStart工作正常

我在PopupWindow中有一个ScrollView。 我使用TranslateAnimation为ScrollView内容制作animation。

animation开始时,onAnimationStart侦听器被调用,但onAnimationEnd没有被调用。 有任何想法吗 ?

布局:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:background="@drawable/popup_window_bg" android:layout_width="match_parent" android:layout_height="wrap_content"> <View android:layout_width="@dimen/toolbar_padding_left" android:layout_height="@dimen/toolbar_height"/> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+web/toolbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scrollbars="none" android:visibility="invisible"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> ... </LinearLayout> </ScrollView> </LinearLayout> 

animation代码:

 mToolbar = mPopupContents.findViewById( R.web.toolbar ); TranslateAnimation anim = new TranslateAnimation(0, 0, -60, 0); anim.setDuration(1000); anim.setAnimationListener(new Animation.AnimationListener() { public void onAnimationStart(Animation a) { Log.d(LOGTAG, "---- animation start listener called" ); } public void onAnimationRepeat(Animation a) {} public void onAnimationEnd(Animation a) { Log.d(LOGTAG, "---- animation end listener called" ); } }); mToolbar.startAnimation(anim); 

更新 :我validation了onAnimationEnd被调用,但在一段延迟之后被调用(假设您在此期间不开始新的animation)。

AnimationEnd不可靠。 如果您不想用覆盖OnAnimationEnd的自定义视图重写代码,请使用postDelayed

以下是一些示例代码:

 final FadeUpAnimation anim = new FadeUpAnimation(v); anim.setInterpolator(new AccelerateInterpolator()); anim.setDuration(1000); anim.setFillAfter(true); new Handler().postDelayed(new Runnable() { public void run() { v.clearAnimation(); //Extra work goes here } }, anim.getDuration()); v.startAnimation(anim); 

虽然它可能看起来很丑,我可以保证它非常可靠。 我用它来插入新行,同时删除animation到其他行的ListViews。 使用AnimationEnd对听众进行压力testingcertificate是不可靠的。 有时候AnimationEnd从来没有被触发。 如果animation未完全完成,您可能需要重新应用postDelayed函数中的任何转换,但这取决于您使用的animationtypes。

之后,我不记得如何可能的职位阅读和天花在这个问题上找出解决scheme,我发现,如果移动的对象不是在屏幕区域(例如被定位在屏幕坐标之外)OnAnimationEndcallback没有得到调用。 可能animation在启动后失败(启动方法被调用,我编写了一个监听器),但没有任何东西写入logcat。 也许这不是你的情况,但这终于解决了我的问题,并希望它也能帮助你。

确保你在使用 view.startAnimation(Animation) 不是 view.setAnimation(Animation) 。 这个简单的混乱可能是一个问题。

-干杯

另外,使用animation时,不要忘记setFillAfter()true

http://developer.android.com/reference/android/view/animation/Animation.html#setFillAfter(boolean);

如果fillAfter为true,则此animation执行的转换在完成时将保持不变。 如果未设置,则默认为false。 请注意,这适用于使用AnimationSet来链接animation。 在AnimationSet自身启动之前,不会应用转换。

 anim.setFillAfter(true); mToolbar.startAnimation(anim); 

对于任何人都磕磕绊绊这个问题:考虑切换到使用Property Animation系统,而不是http://developer.android.com/guide/topics/graphics/prop-animation.html

对于在视图中淡入/淡出的旧方法(通过AlphaAnimation),我遇到了一些问题。 OnAnimationEnd没有被称为等等…使用Property Animation,所有这些问题都解决了。

如果你想支持API <11设备,杰克·沃顿的https://github.com/JakeWharton/NineOldAndroids是要走的路;

你在等待的那个之前没有设置另一个animation吗?

没有语境就难以理解,如果是这样的话……但它可能是导致它的唯一的东西之一。

我想它会在某个时候被调用,因为你正在使用setDuration进行animation并传递1000毫秒。 只要通过0,它不会需要一段时间才能打电话。

这个延迟可能是由anim.setDuration(1000)引起的,或者如果你是在一个线程上这样做,那么可能是由于上下文切换。 尝试操纵延迟时间,看看你是否有任何区别。

尝试使用overridePendingAnimation(int,int)。 即overridePendingAnimation(0,0)

它会覆盖你的默认animation,然后你可以定义你自己的animation通过调用方法startAnimation使用视图的对象。

这是我的示例代码。 不知道这对你有没有帮助。

 overridePendingTransition(0,0); //finish(); v.startAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fadeout)); startActivity(new Intent(ContentManagerActivity.this,Mainmenu_activity.class)); overridePendingTransition(R.anim.fadein,0); 

我试过你的代码,它在OnAnimation开始和inAmimationEnd工作正常也持续时间意味着完成后animationonAnimationEnd被调用,所以你的代码工作正常

 TranslateAnimation anim =new TranslateAnimation(0, 0, -60, 0); anim.setDuration(1000); anim.setAnimationListener(new Animation.AnimationListener() { public void onAnimationStart(Animation a) { Log.w("Start", "---- animation start listener called" ); } public void onAnimationRepeat(Animation a) {} public void onAnimationEnd(Animation a) { Log.d(" end ","---- animation end listener called" ); } }); mIv.setAnimation(anim); mIv.startAnimation(anim); 

可能有人仍然有这个问题,并没有find一个解决scheme,即使读取了很多的stackoverflow答案,像我一样!

所以我的情况是:我用animatorSet

  1. 有没有一个观点,我可以打电话clearAnimation,
  2. 我没有从backgroundThread调用我的animation – 你永远不应该这样做,btw-

作为一个解决scheme,我没有在animatorSet.start()之前调用animatorSet.start()

当您在部分屏幕外的视图中启动animation命令时,会调用animation开始和onStartListener,但animation不会完全运行(不知何故它会在中间中断)。 我的猜测是,因为视图是离屏的,所以它被取消,因此它不被调用。 作为一个解决方法,我创build了我自己的animation监听器,该监听器启动了一个处理程序,并使用postDelayed通知用户animation结束事件。 在Kotlin:

 abstract class PartiallyOffScreenAnimationListener : Animation.AnimationListener, AnimationListener { override fun onAnimationRepeat(animation: Animation?) { onAnimationRepeat_(animation) } override fun onAnimationEnd(animation: Animation) {} override fun onAnimationStart(animation: Animation) { onAnimationStart_(animation) Handler().postDelayed({ onAnimationEnd_(animation) animation.setAnimationListener(null) }, animation.duration + 50) } } 

请注意,如果animation没有完全运行,视图可能会处于不一致的状态(例如,animation布局参数可能会导致奇怪的中间插值因子被丢弃。因此,您应该validation视图处于期望状态的结束callback,如果不是,则手动设置。

像下面这样做

  1. 使animation最终
  2. 在处理程序中调用它
  3. 侦听器应该被实例化一次。
  4. 清晰的animation。

例如view.clearAnimation();

 new Hander().post( run() { final TranslateAnimation ani = new TranslateAnimation(0, 0, 0, 0); ani.setAnimationListener(mListener); } ); private Animation.AnimationListener mListener = new Animation.AnimationListener() { } 

你从哪里开始animation? 如果在onCreate,这是错误的。 尝试在onResume中做到这一点。