另一种棘手的延迟方式



我需要为我的布局应用动画,动画的持续时间为 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 类并检查动画侦听器。

最新更新