属性动画原理
2019-04-07 17:47:09 17 举报
属性动画原理
作者其他创作
大纲/内容
根据values来获取关键帧,values是一个数组,内有几个元素,就有几个关键帧;此时有一个时间系数:fraction ,fraction * duration就是播放此帧的时间点;fraction = i /(values.length - 1),0<i<values.length。
Keyframe.java
2
doAnimationFrame()
KeyframeSet.java
initAnimation()
如果当前target已经有属性动画了,遍历这些属性动画,只要是可以自动取消的,都取消;可以通过ObjectAnimator#setAutoCancel()来设置自动取消。
setTarget()
创建关键帧Keyframe,并返回,如:FloatKeyframe对象;本质就是保存一些关键值:此帧播放的时间点、属性值、属性值的类型等
init()
1
通知注册的监听器:onAnimationStart()
super.start()
setPropertyName()
此方法用于保存动画回调的,即AnimationFrameCallback对象,而ValueAnimator实现了此接口;1. 当mAnimationCallbacks.size() == 0时,会触发Choreographer#postFrameCallback();2. 保存此AnimationFrameCallback对象;
在此构造方法中保存属性name: alpha等;获取关键帧:Keyframe
设置属性name:alpha、translationX等
2. 保存PropertyValuesHolder对象
设置动画总时长
getValue()
循环
animateValue()
获取并保存关键帧
calculateValue()
notifyStartListeners()
initAnimation()方法在ObjectAnimator中重写了
setCurrentFraction()
FloatPropertyValuesHolder(values)
setFloatValues(values)
scheduleFrameLocked()
对比上一个target:oldTarget,如果相等,则不做处理;不等,如果oldTarget已start,则cancel;然后以弱引用(WeakReference)的方式保存当前target。此弱引用为了防止activity的内存泄漏
static ... ofFloat(values)
此方法用于发送更新帧的消息,至少每10ms发一次
通过setter和getter去更新target的属性值
AnimationHandler.java
addAnimationCallback()
autoCancelBasedOn()
setupSetterAndGetter()
构造方法
startAnimation()
Choreographer.java
setAnimatedValue()
此方法在ObjectAnimator中重写了;1. 根据差值器计算进度 fraction; 2. 计算属性值;3. 更新target的属性值;
FrameCallback#doFrame()
postFrameCallback(FrameCallback callback)
1. 初始化估值器:TypeEvaluator;2. 传递给KeyframeSet;
此方法就是取消“需要取消”的动画;此方法还会根据ObjectAnimator#shouldAutoCancel()的返回值,确定是否需要取消。ObjectAnimator#shouldAutoCancel()方法只有在ObjectAnimator#mAutoCancel ==true 且 target相同,且target变化的属性相同,才会返回true
setDuration()
1. 此FrameCallback接口是在AnimationHandler中实现的;2. 如果是延时任务,就会通过Handler发送定时任务3. 最后会通过调用scheduleFrameLocked()发送消息
1计算属性值
FrameCallback的实现是定义在AnimationHandler内的;1. 更新一帧;2. 再次通知Choreographer,通过Handler发送消息,再更新下一帧
1. 取消动画
start()
3
ObjectAnimator.java
PropertyValuesHolder.java
setValues()
ObjectAnimator()
FrameCallback是在Choreographer中定义的接口,专门用于通知更新属性的;
1. 此方法主要获取到对应属性的getter和setter,此二者用于改变target的属性值;2. 首先通过jni去获取setter,如果失败,再通过反射去获取;3. 通过反射去获取getter;
1. 获取PropertyValuesHolder对象
0 条评论
下一页