您的位置:首页 > 其它

属性动画学习总结

2015-08-10 18:44 351 查看
一直以来用补间动画用的比较多,属性动画用的比较少,并用是用后即忘,每次都得在网上看看别人例子,属性动画的博文比较多,在此列出我看过的几篇

郭霖的系列

Android属性动画完全解析(上),初识属性动画的基本用法

Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法

Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法

hongyang的系列

Android 属性动画(Property Animation) 完全解析 (上)

Android 属性动画(Property Animation) 完全解析 (下)

任玉刚的系列

Android属性动画深入分析:让你成为动画牛人

接下来总结下我对动画的认识

动画,无论帧动画,补间动画,属性动画,都是通过代码来随着时间变现展现不同的画面,这样就有动画的效果

属性动画与补间动画其实比较相似,都是给定初始值和终点值以及持续时间,由系统自动计算中间的值,这个计算频率大约是17s,应该是屏幕刷新周期吧(17s的话刚好是1秒刷新60次);其实不用任务动画api自己开个线程也能做到,以前不会用属性动画自己搞过好多次,当然这样比较麻烦些

ValueAnimator其实不能实现什么动画,它的核心就是根据指定的初始值,终点值,以及持续时间,每17s计算一次中间值,然后调用一个回调接口ValueAnimator.AnimatorUpdateListener的onAnimationUpdate(ValueAnimator animation)方法,这个方法是关键,每次屏幕刷新时调用一次,并且从其参数ValueAnimator可以获取其计算的中间值,以前时间流逝值等各种信息,这个回调好像与onComputeScroll类似,我们需要做的就是在这个回调中不断改变画面,这样就成动画了

ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(300);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        float currentValue = (float) animation.getAnimatedValue();
        Log.d("TAG", "cuurent value is " + currentValue);
    }
});
anim.start();


对于ObjectAnimator,其实就是对ValueAnimator进行了封装扩展。其首先会根据传入的属性名反射获取其属性对应的set和get方法,然后同样根据传入的初始值和终点值以及持续时间,每17秒计算并生成中间值,然后调用前面讲的回调方法,与ValueAnimator不同的是,其会在调用回调前,利用set方法将生成的中间值设置给view,因为中间值是不断变化的(当然可以让其不变化,这需要重写TypeEvaluate),所以view属性不断变现,这样呈现的效果就是动态的了

关于TypeEvaluator和TimeInterpolator,两个接口如下.对于TimeInterpolator接口,回调函数getInterpolation(float input)的input参数是指当前动画已经播放时间点总时长的比例,返回值其实是下面TypeEvaluator的回调函数evaluate(float fraction, T startValue, T endValue)的第一个参数fraction,而startValue和endValue就是我们构造Animator时传入的初始值和终止值,而其返回值,其实就是前面所谓的中间值,所以说中间值是从这里计算出来的,所以这个函数是很重要的,如果我们重写evaluator使其返回固定的中间值,其实是没有动画效果的.

public interface TimeInterpolator {
    float getInterpolation(float input);
}


public interface TypeEvaluator<T> {
    public T evaluate(float fraction, T startValue, T endValue);
}


以一个例子总结一下属性动画执行原理

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
animator.setDuration(5000);
animator.start();


构造并启动一个动画后,每大约17秒系统会调用一下TimeInterpolator接口的回调getInterpolation(float input),传入已执行的时间占比input,保存返回的值faction,然后调用TypeEvaluator接口的回调函数evaluate(float fraction, T startValue, T endValue),传入前面计算并保存的fraction以及我们构造animator时传入的初始值和终点值,计算得出中间值,然后根据反射设置textView的rotation,最后调用ValueAnimator.AnimatorUpdateListener接口的onAnimationUpdate(ValueAnimator animation)方法(如果设置了这个接口的话),这样大约每17秒调一次,也就大约每17秒修改一个textView的属性,这就是属性动画了,以上有些是猜测的,不知道对不对,大概应该是这样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: