美文网首页Android 动画
Android属性动画源码分析(一)

Android属性动画源码分析(一)

作者: 古龙小蓝瓶 | 来源:发表于2017-06-14 16:06 被阅读91次

    按照官网上的介绍,属性动画框架是一个可以让任何“内容”动画化的框架,它可以让你通过在指定时间内修改对象的“属性值”来达到动画化的效果(比如View的scaleX,translationX等属性)。它不同于视图动画的一点是他更加灵活,之前提供的视图动画(android.view.animation包)修改的对象仅仅是视图相关的内容,修改的对象只能是View,且仅仅局限于平移,缩放,透明度,旋转及它们的组合;而属性动画框架中,修改的对象则是object,也就是说,不只是view,activity,fragment乃至任何继承Object的对象中定义过的值理论上都可以被修改,而且修改完成之后,是真正的,切切实实的修改。

    对于源码的分析,通常要带着一些问题进行分析,这样在解惑的同时也会对源码有一个很好的认识,首先我们使用属性动画的时候,大概是下面这么个样子:

    public class MainActivity extends AppCompatActivity {
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           // 属性动画示例1
           ObjectAnimator animator = ObjectAnimator.ofFloat(this, "test", 0.8f, 1.0f);
           animator.setInterpolator(new LinearInterpolator());
           animator.setDuration(1000);
           animator.setRepeatCount(3);
           animator.start();
       }
    
       public void setTest(float value) {
           imageView.setAlpha(value);
           imageView.setScaleX(value);
       }
    }
    

    示例1实现的是在1000毫秒内分别将imageView的alpha属性以及scaleX属性从80%到100%进行变化;以上代码也可以写为以下形式:

    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // 属性动画示例2
            PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("alpha", 0.8f, 1.0f);
            PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleX", 0.8f, 1.0f);
            ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(iv_one, holder1, holder2);
            //属性动画的估值器,可以让我们对值的变化进行更细致的计算
            animator.setEvaluator(new TypeEvaluator<Float>() {
                @Override
                public Float evaluate(float fraction, Float startValue, Float endValue) {
                    Log.v("tag", "this is" + startValue + " " + endValue);
    
                    return startValue + fraction * (endValue - startValue);
                }
            });
            animator.setInterpolator(new LinearInterpolator());
            animator.setDuration(1000);
            animator.setRepeatCount(3);
            animator.start();
        }
    }
    

    示例2和示例1实现的功能相同,我们平常在使用属性动画时,通常会考虑到以下几个维度:

    • 改谁:我们会传递一个对象作为要修改的属性,比如示例1中的MainActivity,示例2的imageView
    • 改什么属性:要提供给动画框架我们要修改对象的哪个属性,通过提供属性的名字就可以检索到相关属性的set值(比如示例1的test属性),这是如何做到的?请看后面源码分析
    • 改的属性的变化范围:我们通常要给定修改属性的变化范围,比如从0到1,相应的范围就会产生变化,从而达到属性修改产生动画的效果。
    • 时间:属性变化从起始值到最终值的时间
    • 动画执行次数(repeatCount)
    • 插值器(Interpolator)用于度量属性动画改变的比率(fraction)在当前时刻的值,不同的插值器在同一时刻通过计算得到的比率可能是不同的。
    • 估值器 (Evaluator) 通过得到的比率,通过不同的计算方式返回当前应该得到的属性值
    • 集合(PropertyViewHolder)有时我们可能会修改多个属性(也可以说是执行多个动画),我们通过设置AnimatorSet(多个对象)或者PropertyViewHolder(同一个对象)来达到这一目的
        属性动画框架给我们提供的这些动画框架可以让我们很方便的实现动画的炫酷效果(当然,View的绘制在这里还是起了主要作用),那么这么多的内容是如何串联起来的?我们就从示例1开始一步一步开始对源码进行分析吧。
      其他部分的链接:
      [Android属性动画源码分析(二)]
      [Android属性动画源码分析(三)]
      [Android属性动画源码分析(四)]

    相关文章

      网友评论

        本文标题:Android属性动画源码分析(一)

        本文链接:https://www.haomeiwen.com/subject/nilsqxtx.html