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

原创 2016年08月29日 23:59:10

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方法

版权声明:本文为博主原创文章,未经博主允许不得转载。

属性动画ValueAnimator源码解析

先来看一段代码,如下:ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100); valueAnimator.addUpda...

安卓 属性动画 ValueAnimator ObjectAnimator 源码分析 关键处

属性动画 是 3.0后面的, —-实际上, 这是因为 谷歌 把这个 nineold开源框架 给纳入到 sdk 而己. —-但为了 支持 3.0之前的版本, 我们估计还是得 使用这...

通过源码,手把手带你学属性动画(二) - ValueAnimator基础

主要讲解 ValueAnimator 的基础使用,以实现简单的值动画效果,为后面学习较高级内容、阅读动画源码打下基础...

Android属性动画ValueAnimator源码简单分析

Android开发的过程中经常要用到属性动画,这里对ValueAnimator做一个非常简单的源码过程分析,方便以后在网上扒例子的时候抄的快一点。...

ValueAnimator属性动画学习笔记

属性动画是通过改变对象的属性来改变对象在屏幕中的显示效果,而补间动画就是指开发者只需要指定动画的开始、结束等“关键帧”,而动画变化的“中间帧”则由系统计算并补齐。补间动画只能够作用在View上,它只能...

android属性动画相关类学习---ValueAnimator

ValueAnimator是属性动画机制中的核心类,它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要告诉它初始值和最终值以及动画运行时长,ValueAnimator就好会帮助我们完...

Android 动画之属性动画ValueAnimator

  • 2016年11月04日 14:41
  • 70KB
  • 下载

Android开发 之 属性动画(自定义ValueAnimator的TypeEvaluator)

自定义ValueAnimator的TypeEvaluator 翻译过来就是类型计算器,对,就是一个计算器,只不过这计算器的计算规则由你设定,也就是你要继承重写喽。 对于valueAnimator...

属性动画01-ValueAnimator(数值产生器)

写代码尴尬的是类太多不知道应该使用哪一个,正确的说是不知道某个类是做什么的.所以比较喜欢从源头看一下,有个大致了解.属性动画需要了解的 补间动画需要了解的 属性动画与3.0之前的一个对比因为主...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:属性动画学习ValueAnimator---------源码阅读
举报原因:
原因补充:

(最多只允许输入30个字)