欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

动画之AnimatorSet和AnimationSet的区别

程序员文章站 2022-05-03 08:53:04
...

这两个都是表示动画集,乍一看这两个还以为是一个呢,其实两个是不同的类,下面就总结一下两者的不同:

1.继承关系不同,AnimationSet 使用的是 Animation 子类、AnimatorSet 使用的是 Animator 的子类。

2.功能上AnimatorSet比AnimationSet更强大

  AnimationSet 我们最常用的是调用其 addAnimation 将一个个不一样的动画组织到一起来,然后调用view 的 startAnimation 方法触发这些动画执行。注意是同时执行,功能较弱不能做到把集合中的动画按一定顺序进行组织然后在执行的定制。 

        TranslateAnimation translateAnimationX = new TranslateAnimation(0,endX, 0, 0);
        translateAnimationX.setInterpolator(new LinearInterpolator());
        translateAnimationX.setRepeatCount(0);// 动画重复执行的次数
        translateAnimationX.setFillAfter(true);
        TranslateAnimation translateAnimationY = new TranslateAnimation(0, 0, 0, endY);
        ////  AccelerateInterpolator  在动画开始的地方速率改变比较慢,然后开始加速
        translateAnimationY.setInterpolator(new AccelerateInterpolator());
        translateAnimationY.setRepeatCount(0);// 动画重复执行的次数
        translateAnimationX.setFillAfter(true);
        //false指使用自己的差值器
        final AnimationSet set = new AnimationSet(false);
        set.setFillAfter(false);
        set.addAnimation(translateAnimationY);
        set.addAnimation(translateAnimationX);
        set.setDuration(800);// 动画的执行时间
        view.startAnimation(set);

  AnimationSet不单单可以使多个动画同时执行,还可以将多个动画按照不同的顺序执行,它有多个方法如下

playTogether 同时执行

ObjectAnimator animatorA = ObjectAnimator.ofFloat(textView, "TranslationX", -300, 300, 0);
ObjectAnimator animatorB = ObjectAnimator.ofFloat(textView, "scaleY", 0.5f, 1.5f, 1f);
ObjectAnimator animatorC = ObjectAnimator.ofFloat(textView, "rotation", 0, 270, 90, 180, 0);

AnimatorSet animatorSet2 = new AnimatorSet();
animatorSet2.playTogether(animatorA, animatorB, animatorC);
animatorSet2.setDuration(3*1000);
animatorSet2.start();

playSequentially 按顺序执行

ObjectAnimator animatorA = ObjectAnimator.ofFloat(textView, "TranslationX", -300, 300, 0);
ObjectAnimator animatorB = ObjectAnimator.ofFloat(textView, "scaleY", 0.5f, 1.5f, 1f);
ObjectAnimator animatorC = ObjectAnimator.ofFloat(textView, "rotation", 0, 270, 90, 180, 0);

AnimatorSet animatorSet2 = new AnimatorSet();
animatorSet2.playSequentially(animatorA, animatorB, animatorC);
animatorSet2.setDuration(3*1000);
animatorSet2.start();

bebefore、after、with等方法   

ObjectAnimator animatorA = ObjectAnimator.ofFloat(textView, "TranslationX", -300, 300, 0);
ObjectAnimator animatorB = ObjectAnimator.ofFloat(textView, "scaleY", 0.5f, 1.5f, 1f);
ObjectAnimator animatorC = ObjectAnimator.ofFloat(textView, "rotation", 0, 270, 90, 180, 0);

AnimatorSet animatorSet3 = new AnimatorSet();
animatorSet3.play(animatorA).after(animatorC).before(animatorB);
animatorSet3.setDuration(3*1000);
animatorSet3.start();

实现的效果就是先播放animatorC的动画,再播放animatorA的动画,最后在播放animatorB的动画。

3.动画实现性质不同,Animation 是针对视图外观的动画实现,动画被应用时外观改变但视图的触发点不会发生变化,还是在原来定义的位置。 

Animator  是针对视图属性的动画实现,动画被应用时对象属性产生变化,最终导致视图外观变化。 

分类

java类 xml资源id 说明
AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator 其变化开始和结束速率较慢,中间加速
AccelerateInterpolator @android:anim/accelerate_interpolator 其变化开始速率较慢,后面加速
DecelerateInterpolator @android:anim/decelerate_interpolator 其变化开始速率较快,后面减速
LinearInterpolator @android:anim/linear_interpolator 其变化速率恒定
AnticipateInterpolator @android:anim/anticipate_interpolator 其变化开始向后甩,然后向前
AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator 其变化开始向后甩,然后向前甩,过冲到目标值,最后又回到了终值
OvershootInterpolator @android:anim/overshoot_interpolator 其变化开始向前甩,过冲到目标值,最后又回到了终值
BounceInterpolator @android:anim/bounce_interpolator 其变化在结束时反弹
CycleInterpolator @android:anim/cycle_interpolator 循环播放,其速率为正弦曲线
TimeInterpolator   一个接口,可以自定义插值器
插值器
相关标签: 动画