Android 后验证与后验证

Android 后验证与后验证,android,Android,问题是什么时候我应该在postInvalidate()上使用postInvalidate() Doc说的关于postInvalidateOnAnimation():会导致在下一个动画时间步(通常是下一个显示帧)发生失效。 但什么是下一个动画时间步长/下一个显示帧?什么时候调用它?看看这个类: 文档中的简短描述: 协调动画、输入和绘图的计时 编舞器从显示子系统接收定时脉冲(如垂直同步),然后将工作安排为渲染下一显示帧的一部分 应用程序通常使用动画框架或视图层次结构中的更高级别抽象与编舞人员进行间接

问题是什么时候我应该在
postInvalidate()
上使用
postInvalidate()

Doc说的关于
postInvalidateOnAnimation()
会导致在下一个动画时间步(通常是下一个显示帧)发生失效。

但什么是下一个动画时间步长/下一个显示帧?什么时候调用它?

看看这个类:

文档中的简短描述: 协调动画、输入和绘图的计时

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


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

我一直在为一个动画故障而困惑,并偶然发现了这个问题。试图回答以下问题:

下一个显示框是什么?

此时将处理所有图形、布局和输入

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

编排器是“UI线程”消息处理循环。在每个VSync上,都会处理UI消息。这些消息将处理输入并重新绘制显示。(如果UI运行太慢,编舞者还会做其他事情,例如跳过帧-这是调试控制台上的常见消息!)

此消息循环处理构成一个帧。什么时候调用它?在60Hz帧速率下每1/60秒调用一次

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

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

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

理由:

这很难回答,这两种方法都适用于与UI线程通信的线程。所以我深入研究了这个问题

在doFrame()中找到了这个

postInvalidateOnAnimation将在动画回调中放入回调,postInvalidate将在遍历回调中放入回调

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

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

doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos);
doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos);
doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos);