我需要为布局应用动画,动画的持续时间如下所示200毫秒
<scale
android:fromXScale="1.0"
android:toXScale="0.0"
android:fromYScale="1.0"
android:toYScale="0.0"
android:duration="200"
android:pivotX="50%"
android:pivotY="50%" />
这是关闭动画,因此在完成动画后,我必须使用以下命令删除视图:
mWindowManager.removeView(myView);
但是问题是,它不会等待200毫秒动画完成,因此会立即将removeView删除,因此用户认为没有关闭的动画(我知道,因为我在动画之后没有尝试过removeView,所以它可以正常工作,但视图仍然存在) 我尝试使用以下处理程序来延迟removeView:
Handler handler = new Handler();
handler.postDelayed(()->{
mWindowManager.removeView(myView);
}, 200);
但出现错误:
IllegalArgumentException: View=com.example.administrator.AssistiveTouch.MyGroupView{683f971 V.E...... ......I. 0,0-0,0} not attached to window manager
我认为原因是处理程序在不同的实例(或线程等)中工作,对不起英语有点不好,所以找不到myView
是否有任何其他方法可以延迟应用程序以使动画有时间执行?
答案 0 :(得分:3)
您实际上应该只是基于回调对它做出反应,而不是尝试“定格”动画的结尾。
尝试“定时”动画结束的问题是不能保证一致性。如果在View仍处于动画状态时开始删除View的代码怎么办?没有更多的View可以进行动画处理,这意味着崩溃是不可避免的。
您要使用哪种Animation类作为结束动画?动画结束时应该有一个回调接口供您响应。
例如,如果您使用的是ObjectAnimator
,则可以使用带有animator.addListener(Animator.AnimationListener listener)
回调的onAnimationEnd()
方法。
只需将removeView()
代码放在该onAnimationEnd()
回调中,动画结束后它将立即运行。
因此,请查看正在使用的Animator类,并检查动画侦听器。