另一个棘手的延迟方式?

时间:2019-01-14 08:36:55

标签: android

我需要为布局应用动画,动画的持续时间如下所示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

是否有任何其他方法可以延迟应用程序以使动画有时间执行?

1 个答案:

答案 0 :(得分:3)

您实际上应该只是基于回调对它做出反应,而不是尝试“定格”动画的结尾。

尝试“定时”动画结束的问题是不能保证一致性。如果在View仍处于动画状态时开始删除View的代码怎么办?没有更多的View可以进行动画处理,这意味着崩溃是不可避免的。

您要使用哪种Animation类作为结束动画?动画结束时应该有一个回调接口供您响应。

例如,如果您使用的是ObjectAnimator,则可以使用带有animator.addListener(Animator.AnimationListener listener)回调的onAnimationEnd()方法。

只需将removeView()代码放在该onAnimationEnd()回调中,动画结束后它将立即运行。

因此,请查看正在使用的Animator类,并检查动画侦听器。