我需要为我的布局应用动画,动画的持续时间为 200 milisec,如下所示
<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 milisec 等动画完成,它会立即删除视图,因此用户认为没有关闭动画(我知道,因为我尝试在动画后不删除视图,它可以工作但视图仍然存在)我尝试使用如下处理程序来延迟删除视图:
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
是否有任何不同的方法来延迟应用程序以给动画一些时间来执行?
与其尝试"计时"动画的结尾,不如根据回调对它做出反应。
尝试"计时"动画结尾的问题在于无法保证一致性。如果在视图仍在动画时开始删除视图代码,该怎么办?没有更多的视图可以动画化,这意味着崩溃是不可避免的。
你用什么动画课做闭幕动画?应该有一个回调接口供您在动画结束时响应。
例如,如果您使用的是ObjectAnimator
则有一个带有onAnimationEnd()
回调的animator.addListener(Animator.AnimationListener listener)
方法。
只需将removeView()
代码放在该onAnimationEnd()
回调中,动画结束后它就会运行。
因此,请查看您正在使用的 Animator 类并检查动画侦听器。