Android 动画

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

2017-06-14  本文已影响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实现的功能相同,我们平常在使用属性动画时,通常会考虑到以下几个维度:

上一篇下一篇

猜你喜欢

热点阅读