PostInvalidateOnAnimation vs postInvalidate

时间:2015-03-23 20:05:57

标签: android

问题是我应该何时使用postInvalidateOnAnimation()而不是postInvalidate()

Doc说postInvalidateOnAnimation()Cause an invalidate to happen on the next animation time step, typically the next display frame. 但是下一个动画时间步/下一个显示帧是什么?什么时候会被召唤?

2 个答案:

答案 0 :(得分:11)

我一直在困惑一个动画故障并偶然发现了这个问题。试着回答如下:

下一个显示框是什么?

这是处理所有绘图,布局和输入的时间。

垂直同步(VSync)的概念在Android 4.1之后的Choreographer类中使用。这是传统上从硬件发送的信号,表示屏幕已准备好重新绘制。 (它起源于阴极射线管)这在显示器上通常约为60Hz。

Choreographer是' UI线程'消息处理循环。在每个VSync上,都会处理UI消息。这些消息将处理输入并重绘显示。 (如果UI运行速度太慢,Choreographer还会执行其他操作,例如跳帧) - 这是调试控制台上的常见消息!)

此消息循环处理构成一个帧。什么时候会被调用 - 每60秒帧速率的1/60秒。

video 来自Google I / O 2012更详细地描述了这个vsync和编舞。

postInvalidateOnAnimation()与postInvalidate()之间有什么区别?

当需要平滑动画时,使用postInvalidateOnAnimation,当需要重绘时使用postInvalidate()。

推理:

这很难回答,这两种方法都适用于与UI Thread进行通信的线程。所以我挖到了Choreographer code

在doFrame()

中找到了这个
doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos);
doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos);
doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos);

postInvalidateOnAnimation会将回调放入动画回调中,postInvalidate将会进入遍历回调。

对我来说,关键的区别在于在遍历回调(布局,绘制)之前调用动画回调。

这意味着动画回调将以几乎正好60fps(先处理)调用,而遍历回调可能会有一些小的抖动,因为布局和视图绘制完成(小于1/60秒的抖动,但可能仍然很明显)

答案 1 :(得分:1)

看一下这堂课:http://developer.android.com/reference/android/view/Choreographer.html

文档的简短说明: 协调动画,输入和绘图的时间。

编舞者从显示子系统接收定时脉冲(例如垂直同步),然后安排工作作为渲染下一个显示帧的一部分。

应用程序通常使用动画框架或视图层次结构中的更高级别抽象间接与编舞者交互。以下是使用更高级别API可以执行的一些示例。