问题是我应该在postInvalidate()之后使用postInvalidateOnAnimation()?
Doc说关于postInvalidateOnAnimation():导致在下一个动画时间步骤(通常是下一个显示帧)发生无效.
但是什么是下一个动画时间步/下一个显示帧?什么时候会叫?
解决方法
我一直困惑着一个动画故障,并绊倒了这个问题.试图回答如下:
下一个显示框是什么?
这是在处理所有绘图,布局和输入时.
垂直同步(VSync)的概念在Android 4.1之后的Choreographer类中使用.这是传统上从硬件发送的信号,说屏幕准备重新绘制. (它来源于阴极射线管)这通常在监视器上约为60Hz.
编排器是“UI线程”消息处理循环.在每个VSync上,都会处理UI消息.这些消息将处理输入并重绘显示. (编排者也会做其他的事情,如跳过框架,如果用户界面运行太慢 – 这是调试控制台上的常见消息!)
该消息循环处理构成一个帧.什么时候被称为 – 每60秒一秒钟60Hz的帧率.
这个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秒的抖动,但可能仍然是显着的)