动画之AnimatorSet和AnimationSet的区别

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

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 一个接口,可以自定义插值器
插值器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值