一、官方介绍
Choreographer是用于协调动画、输入和绘图的时间的。
Choreographer从显示子系统接收时间脉冲(比如垂直同步),然后安排下一个显示帧渲染工作。
应用通常通过动画框架和视图层次结构的高级抽象方法与choreographer进行交互。下面是一些可以通过高级api可以做的操作:
使用android.animation.ValueAnimator#start
未完……
二、Choreographer可以协调的操作类型
1. CALLBACK_INPUT = 0
输入回调,最先执行的,优先级比较高
2. CALLBACK_ANIMATION = 1
动画回调,在traversals之前运行
3. CALLBACK_TRAVERSAL = 2;
遍历回调,处理layout和draw,在所有的异步信息处理之后运行。
4. CALLBACK_COMMIT = 3;
处理frame的post-draw操作。在traversal操作完成后运行。
三、Choreographer是如何管理各种回调的
是由一个CallbackRecord组成的链表来记录要执行的各种回调的
是由一个CallbackQueue数组来管理这些链表的(添加、删除),每一种回调类型一个CallbackQueue
mHead是第一个CallbackRecord,执行时间最近的一个
为什么要重新写一个CallbackQueue?
因为这个队列使用的很频繁,所以自己封装一个轻量级的Queue
四、Choreographer是如何与上层Api交互的
如上图:上层框架创建Choreographer的实例,并循环进行调用
五、mCallbackPool对象的使用(性能优化)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
private CallbackRecord obtainCallbackLocked(long dueTime, Object action, Object token) { CallbackRecord callback = mCallbackPool; if (callback == null) { callback = new CallbackRecord(); } else { mCallbackPool = callback.next; callback.next = null; } callback.dueTime = dueTime; callback.action = action; callback.token = token; return callback; } private void recycleCallbackLocked(CallbackRecord callback) { callback.action = null; callback.token = null; callback.next = mCallbackPool; mCallbackPool = callback; } |
其中obtainCallbackLocked是用于试图新建一个CallbackRecord,recycleCallbackLocked是用于回收一个CallbackRecord
重复利用mCallbackPool,尽量避免重复创建CallbackRecord
六、为什么不用Handler管理?
因为它还有自己其他的业务逻辑,比如CallbackQueue。
Sorry, the comment form is closed at this time.