属性动画学习ValueAnimator---------源码阅读

来源:互联网 发布:四维排课软件免费下载 编辑:程序博客网 时间:2024/05/19 17:47

ValueAnimator实现结构图
看了android官方文档知道ValueAnimator可以实现任意值随时间的变化,首先想到的实现方式是timer或Handler;看了一下源码才发现是通过底层的VSync信号触发的周期回调来实现的,上面这个图简单的展示了ValueAnimator实现原理:
1.ValueAnimator调用start 方法把自身注册到AnimationHandler的mPendingAnimation数组
2.AnimationHandler通过scheduleAnimation调用Chereographer,postcallBack把mAnimate,mCommit(Runnable对象)封装成CallBackRecord注册到Chereographer的mCallBacks
3.Chereographer通过FrameDisplayEventReceiver的scheduleVsync向Vsync注册
4.Vsync产生后会触发FrameDisplayEventReceiver的OnVSync方法,逐层向上回调
1.ValueAnimator
ValueAnimator结构
对象创建
上图init分支,列出了创建ValueAnimator的方法,通常可以对int,float,色值(int),PropertyValueHolder进行变化处理,也可以对特定对象定义TypeEvaluator,指定对象属性变化规则。

  public static ValueAnimator ofInt(int... values) {        ValueAnimator anim = new ValueAnimator();        anim.setIntValues(values);        return anim;    }public void setIntValues(int... values) {        if (values == null || values.length == 0) { ![这里写图片描述](http://img.blog.csdn.net/20160908225708213)           return;        }        if (mValues == null || mValues.length == 0) {            setValues(PropertyValuesHolder.ofInt("", values));        } else {            PropertyValuesHolder valuesHolder = mValues[0];            valuesHolder.setIntValues(values);        }        // New property/values/target should cause re-initialization prior to starting        mInitialized = false;    }  /**     * The property/value sets being animated.     */    PropertyValuesHolder[] mValues;    /**     * A hashmap of the PropertyValuesHolder objects. This map is used to lookup animated values     * by property name during calls to getAnimatedValue(String).     */    HashMap<String, PropertyValuesHolder> mValuesMap;  public void setValues(PropertyValuesHolder... values) {        int numValues = values.length;        mValues = values;        mValuesMap = new HashMap<String, PropertyValuesHolder>(numValues);        for (int i = 0; i < numValues; ++i) {            PropertyValuesHolder valuesHolder = values[i];            mValuesMap.put(valuesHolder.getPropertyName(), valuesHolder);        }        // New property/values/target should cause re-initialization prior to starting        mInitialized = false;    }

ValueAnimator的初始化方法最终通过调用setValues,向mValues添加PropertyValuesHolder对象,所有的属性都是通过PropertyValuesHolder进行管理
属性和listener
安卓官方文档给我们列出了使用属性动画可设置的动画特征:时长(duration),时间插值器,重复次数与反播,组合动画,帧延时。ValueAnimator作为属性动画的主要API,除了上面列出的功能和AnimationListener(补间动画也有),还提供AnimatorUpdateListener,在每次回调时更新属性值。
动画控制
提供start,pause,resume,cancel,end等控制方法,这些方法都 通过AnimatorHandler对ValueAnimator进行管理,AnimatorHandler是线程唯一的,每个含有消息队列的线程可以有一个AnimatorHandler,对线程里的所有Animator进行管理
private void start(boolean playBackwards) {
。。。。。
AnimationHandler animationHandler = getOrCreateAnimationHandler();
animationHandler.mPendingAnimations.add(this);
if (mStartDelay == 0) {
// This sets the initial value of the animation, prior to actually starting it running
if (prevPlayingState != SEEKED) {
setCurrentPlayTime(0);
}
mPlayingState = STOPPED;
mRunning = true;
notifyStartListeners();
}
animationHandler.start();
}

AnimationHandler
类结构
AnimationHandler把mAnimate和mCommit对象传给Chrogeographer,在VSync到来时会触发回调,调用doAnimationFrame()
final Runnable mAnimate = new Runnable() {
@Override
public void run() {
mAnimationScheduled = false;
doAnimationFrame(mChoreographer.getFrameTime());
}
};
doAnimationFrame会处理上图蓝色成员,完成动画状态的切换,并对正在执行的动画进行处理,回调ValueAnimator的doAnimationFrame方法

0 0
原创粉丝点击