关闭

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

标签: android动画ValueAnima
187人阅读 评论(0) 收藏 举报
分类:

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16280次
    • 积分:638
    • 等级:
    • 排名:千里之外
    • 原创:39篇
    • 转载:9篇
    • 译文:3篇
    • 评论:0条
    文章分类