清除排队的视图无效(由postInvalidateDelayed排队)

时间:2018-11-08 02:26:00

标签: android

在我的特定自定义视图的onDraw()中,我想做一些动画。因此,我调用postInvalidateDelayed()使下一个动画帧的绘制排队。但是,如果我的视图也从其他代码中无效,那么我最终可能会遇到多个排队的无效器。这样动画的速度比预期快了N倍。

在发布新的无效消息之前,是否有办法清除排队的无效消息?

还是确定已经排队的无效人员?

或者也许有其他方法可以防止我的动画在每一次额外的使无效的调用(除了正在排队的调用之外)中加速?

override fun onDraw(canvas:Canvas){
    if (needToDrawAnimation){
        drawNextScene(canvas)
        postInvalidateDelayed(1000)
    }
}

谢谢。

1 个答案:

答案 0 :(得分:1)

我能够通过使用ObjectAnimator驱动动画来解决此问题。 ObjectAnimator修改我的View类的一个整数属性(代表帧索引)。在视图的OnDraw()中,我决定是否启动/停止ObjectAnimator。在动画属性的设置器中,我称为invalidate()。

结果是,对View上的invalidate()的任何调用都将使它进入正确的动画状态。此外,如果View认为合适,则View可以停止动画播放(例如,如果View所显示的数据在onDraw()时指示如此)。