property animation(属性动画)、view animation(补间动画)、drawable animation(帧动画)比较

一.属性动画
属性动画相对于位补间动画说,更稳定健壮一些,属性动画不仅能够实现view的动画,更能实现非view的动画,可以说能实现anything做动画,例如颜色等。属性动画可以定义以下几个属性:
1.Duration
该属性是定义一次动画执行下来所花的时间,默认是300ms。
2.Repeat count and behavior
该属性是定义一个动画重复的次数以及怎样去实现重复,即是从头开始重复还是倒退回去再重复。
3.Animator sets
顾名思义,就是几套动画的集合,可以设置这几套动画是按定义的顺序执行还是按指定的顺序执行亦或者同时执行。
4.Frame refresh delay
该属性具体还不清楚,API上说是将我们的动画的刷新频率延迟的,默认是10ms刷新一次,但什么是动画的刷新频率?还望大牛指教…
二.属性动画和补间动画的优缺点比较
补间动画相对于属性动画有几个比较明显的不足:
1. 补间动画只能针对view做文章,就是说,如果目标不是一个view,补间动画就无法用在这个目标上。
2. 补间动画仅仅能实现将我们的目标view进行缩放、移动、旋转(z轴上的平面旋转,而非Y轴、X轴上的立体旋转)、透明改变,却无法实现将这个view的颜色等更细节上的属性做动画。
3. 补间动画还有一个约束,那就是补间动画是通过不断的改变整个view的渲染轨迹实现动画,而不是去改变这个view的本身的属性实现动画,这个约束在其位移动画中表现尤为明显,例如我们将一个图片沿x轴从A点移动到B点,到B点的时候我们将这个图片旋转90度并停留在B点,准备一个没有src的ImageView显示这张图片,动画执行结束后,只要我们在A点到B点间的x轴上任意一个位置点击,就会发现空ImageView上显示的还是没有旋转过90度的图片了。

而属性动画就没有上述的约束,但补间动画并非毫无优势滴,设置简单、代码简单粗暴就是补间动画最亮的优势,所以,当补间动画能实现了我们的需求时,我们完全没有必要去用属性动画代替。

三.使用属性动画
1.要实现属性动画,通常我们调用的是ObjectAnimation类,

ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f);
anim.setDuration(1000);
anim.start();

//其中,foo是执行动画的Object,"alpha"是动画类型的名称(其他还有translationY位移动画、scaleX缩放动画、alpha透明度动画),0f、1f则是这个动画的属性值。如果需要传int类型的值,则要调用相应的ofInt()函数,但函数中的动画的属性值不能一个是int的,另一个却是float的。如果只传一个属性值的话,系统默认会将这个值认定为动画结束时的属性值,而不是动画开始的属性值。如果需要通过颜色实现动画,即做霓虹灯样的效果(这就是补间动画不能做到的),则需要用到ArgbEvaluator(父类是Evaluator,其还有其他实现类,感兴趣的话可以去看看):

ObjectAnimator animator = ObjectAnimator.ofObject(v,
                "backgroundColor", new ArgbEvaluator(), Color.RED, Color.GREEN,
                Color.BLUE);

        animator.setDuration(3000);
        animator.setRepeatCount(ObjectAnimator.INFINITE);
        animator.setRepeatMode(ObjectAnimator.REVERSE);
        animator.start();

2.属性动画集合

ObjectAnimator trans = ObjectAnimator.ofFloat(targetView, "translationY", 0, 250);

        ObjectAnimator scale = ObjectAnimator.ofFloat(targetView, "scaleX", 1, 2, 4, 2,1);

        ObjectAnimator alpha = ObjectAnimator
                .ofFloat(targetView, "alpha", 0, 1, 0.5f, 1);

        AnimatorSet set = new AnimatorSet();

        // set.playSequentially(trans, scale);// 顺序播放

        // set.playTogether(trans, scale);// 同步播放

        set.play(trans).after(scale);
        set.play(trans).after(alpha);

        set.setDuration(3000);
        set.start();

3.xml配置属性动画
首先在项目的res目录下创建animator目录(注意:补间动画的是anim目录):
这里写图片描述
3.1 xml配置单个属性动画
在animator目录下创建ObjectAnimator类型的xml文档,在该xml文档中就可以配置对应的属性动画了,这里的例子是配置位移动画:

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:propertyName="translationX"
    android:valueFrom="0"
    android:valueTo="300"
    android:valueType="floatType" >

</objectAnimator>

3.2 xml配置属性动画集合

在animator目录下创建set类型的xml文档,以下配置的是两个位移动画的集合,值得注意的是,配置动画集合时要在set节点上配置各个动画的播放顺序!

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together" >

    <objectAnimator
        android:duration="5000"
        android:propertyName="translationX"
        android:valueFrom="0"
        android:valueTo="350"
        android:valueType="floatType" >
    </objectAnimator>
    <objectAnimator
        android:duration="3000"
        android:propertyName="translationY"
        android:valueFrom="0"
        android:valueTo="200"
        android:valueType="floatType" >
    </objectAnimator>

</set>

在代码中调用xml配置的属性动画:

Animator animator = AnimatorInflater
                .loadAnimator(this, R.animator.set);
        animator.setTarget(v);//设置执行动画的view
        animator.start();

个人觉得xml配置属性动画时,配置不是很丰富,所以不建议这种方式使用属性动画。

猜你喜欢

转载自blog.csdn.net/jack_bear_csdn/article/details/51759535