动画之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 | 一个接口,可以自定义插值器 |
上一篇: 【7】AccessDB快速数据访问
推荐阅读
-
iOS基础知识之@property 和 Ivar 的区别
-
python列表操作之extend和append的区别实例分析
-
百度理财产品之百赚与百赚利滚利有什么区别?百赚和百赚利滚利版的区别对比
-
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
-
Python Pandas DataFrame:查询数据or选择数据(selection)之loc,iloc,at,iat,ix的用法和区别
-
jQuery之DOM对象和jQuery对象的转换与区别分析
-
IOS开发(45)之delegate和Notification的区别
-
Python探索之静态方法和类方法的区别详解
-
唐朝的“华夷之辨”和其他朝代有什么区别?不以民族论华夷从此开始!
-
ajax中的async属性值之同步和异步及同步和异步区别