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
和
- 有没有一个观点,我可以打电话clearAnimation,
- 我没有从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,如果不是,则手动设置。
像下面这样做
- 使animation最终
- 在处理程序中调用它
- 侦听器应该被实例化一次。
- 清晰的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中做到这一点。